我正在尝试解决 leetcode.com ( https://leetcode.com/problems/number-of-1-bits/ )上的一个简单问题,但我遇到了一个奇怪的行为,这可能是我缺乏理解...
我对链接中问题的解决方案如下:
public int HammingWeight(uint n) {
int sum = 0;
while (n > 0) {
uint t = n % 10;
sum += t == 0 ? 0 : 1;
n /= 10;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案是隔离每个数字,如果是一个,则增加sum. 当我在我的 PC 上运行它时,它起作用了(是的 - 我知道这不是最佳解决方案,考虑到它是二进制表示,还有更优雅的解决方案)。
但是当我尝试在 leetcode 编辑器中运行时,它返回了以下输入的错误答案 (00000000000000000000000000001011)。
除了打印到控制台之外,没有真正简单的调试方法,所以我打印了n输入方法时的值并得到了结果,11而不是1011- 在我的 PC 上我得到了11。如果我采用不同的解决方案 - 使用按位右移或按 2 计算 mod 的解决方案,那么即使打印n仍然是11. 考虑到这n是“错误的”(与我的 PC 和所描述的站点不同),我预计这些解决方案也会失败。
我是否缺少有关 的表示的一些知识uint?还是uint变量中的二进制数?
您的代码似乎将其作为基数 10(十进制)处理,但汉明权重约为基数 2(即二进制)。所以:如果做% 10and /= 10,你应该看% 2and /= 2。
至于什么uint看起来像二进制:本质上 是这样的,但是......允许 CPU 谎报每个八位字节的实际位置(又名“字节序”)。好消息是:它通常不会将谎言暴露给你,除非你作弊并通过查看原始记忆来了解幕后情况。只要您使用常规运算符(包括按位运算符):谎言就不会被发现。
附注:二进制的工作,是关于检查了一下,洗牌的数据下降,& 1而>> 1通常最好是把% 2和/ 2。但正如 canton7 所指出的:对于这种特定场景,也有内置操作,它在可能的情况下使用 CPU 内在指令(但是:使用内置函数并不能帮助您增加理解!)。