首页 > 解决方案 > 为什么这个 bitcount 代码没有通过它的测试?

问题描述

我现在在 bit.c 实验室工作。我做了函数bitCount。我认为它是完美的,但它无法通过测试。我不知道为什么。

int bitCount(int x) {
    unsigned int a = 0x01010101;
    int b;
    int result = 0;
    result += a&x;
    result += a&(x>>1);
    result += a&(x>>2);
    result += a&(x>>3);
    result += a&(x>>4);
    result += a&(x>>5);
    result += a&(x>>6);
    result += a&(x>>7);
    b = result + result >> 8;
    b = b + result >> 16;
    b = b + result >> 24;
    return b&0xff;
}

标签: cbit

解决方案


您正在对错误的位求和,因为在这些行中+具有高于 , 的优先级:>>

b = result + result >> 8;
b = b + result >> 16;
b = b + result >> 24;

让我们假设result == 0x01020304

  • 该表达式result + result >> 8将导致0x01020304 + 0x01020304 >> 8, 然后0x02040608 >> 8, 最后0x020406
  • 该表达式b = b + result >> 16将导致0x020406 + 0x01020304 >> 16, 然后0x0104070A >> 16, 最后0x010407
  • 该表达式b = b + result >> 24将导致0x010407 + 0x01020304 >> 24, 然后0x0103070B >> 24, 最后0x010307
  • 最后,表达式b&0xff导致0x07. 0x0A不是我们期望的结果或 10。

因此,您必须:

  1. 确保在添加之前完成移位。使用括号()
  2. 用 屏蔽不必要的位& 0xFF。请注意,这不是绝对必要的,因为有b&0xff,但在我看来,它使意图更清晰。

例子:

b = (result & 0xFF) + (result >> 8 & 0xFF);
b = b + (result >> 16 & 0xFF);
b = b + (result >> 24 & 0xFF);

推荐阅读