c - 为什么这个 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;
}
解决方案
您正在对错误的位求和,因为在这些行中+
具有高于 , 的优先级:>>
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。
因此,您必须:
- 确保在添加之前完成移位。使用括号
()
。 - 用 屏蔽不必要的位
& 0xFF
。请注意,这不是绝对必要的,因为有b&0xff
,但在我看来,它使意图更清晰。
例子:
b = (result & 0xFF) + (result >> 8 & 0xFF);
b = b + (result >> 16 & 0xFF);
b = b + (result >> 24 & 0xFF);
推荐阅读
- linux - 来自 Cython 的 syscall 或 gettid 系统函数
- javascript - 基于状态的函数执行,不能正常工作
- javascript - JS 功能不工作
- python - 顺序 (k,
) RDD - javascript - window.onload 无法正常工作 chrome 开发控制台
- java - 奇怪的 LiveData 行为?
- java - RecyclerView 中的媒体播放器错误
- python - 使 Gtk.TreeView 显示计算的单元格内容
- javascript - 使用 PHP 上传视频
- android - SQLiteException:接近“发生”:语法错误(代码 1)