POJ 2453

#include <iostream>
using namespace std;

int countBits(int n) {
	int count=0;
	//MSBから順に,立っているかチェック
	for (unsigned int mask=0x80000000; mask>0; mask>>=1) {
		if (mask & n) count++;
	}
	return count;
}

int main() {
	int n;
	while (true) {
		cin >> n;
		if (n == 0) break;
		int cn = countBits(n);
		do {
			n++;
		} while (countBits(n) != cn);
		cout << n << endl;
	}
	return 0;
}

間違えたポイント

演算子の優先順位

if (mask & n > 0)
って書くと,if (mask & (n > 0))と解釈される?みたいではまった.

maskの最大値

(0 <= I <= 1000000)だから,32ビット全部やらなくていいか〜とおもってmask=0x80000(20ビット目)から始めてしまった.本当はI=1000000のときJは20ビット以上になる可能性があるので,これではダメ.結局32ビットやるようにした.

maskのビット数

unsigned intにしないと32ビット丸々使えない.