【发布时间】:2015-11-02 15:37:06
【问题描述】:
我必须打印最大N 位的数字,其中count of bits set to 1 = count of bits set to 0。我忽略了前导零。我认为这仅适用于位数为偶数的情况。
我的代码:
int power(k) {
return 1 << k;
}
void print_numbers(int n){
n -= (n % 2); // FOR EVEN COUNT OF BITS
int exp = 1; // EXPONENTS WILL BE ODD (2^1, 2^3, 2^5, ...)
while (exp < n) {
int start = power(exp);
int end = power(exp + 1);
int ones = (exp + 1) / 2; // ALLOWED COUNT OF 1
for (int i = start; i < end; i++) {
int bits_count = 0;
for (int j = 0; j <= exp; j++){ // CHECK COUNT OF 1
bits_count += ((i >> j) & 1);
}
if (bits_count == ones){
printf("%d\n", i);
}
}
exp += 2;
}
对于N = 12,此函数打印 637 个数字。这个解决方案是正确的还是我错了?任何想法更有效或更好的解决方案?
【问题讨论】:
-
看起来像codereview.stackexchange.com 的问题,假设代码有效。
-
那么你是从最高位开始计算位长吗?换句话说,每个数字的第一位总是
1吗? -
@VladfromMoscow:他的意思是设置为1的位数等于设置为0的位数,比如
11001100。 -
MLN96:“每个数字都以 1 开头”是,恕我直言,比部分示例列表更清晰的陈述,似乎符合该简单描述,如下所示@Thomas 的问题 :)
-
无论如何,如果您的意思是所有数字都以 1 开头,那么长度为
2k的“平衡”数字的数量为 C(2k, k-1)(其中 C 是二项式函数),而 k 从 1 到 6 的 C(2k, k-1) 之和确实是 637。FWIW。
标签: c bit-manipulation bitwise-operators bit-shift bitwise-and