gpt4 book ai didi

c# - uint 的二进制表示是什么样的?

转载 作者:行者123 更新时间:2023-12-03 21:25:50 32 4
gpt4 key购买 nike

我试图在 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;
}

我的解决方案是隔离每个数字,如果是一个,则增加总和。当我在我的 PC 上运行它时它起作用了(是的 - 我知道这不是最佳解决方案并且考虑到它是二进制表示还有更优雅的解决方案)。

但是当我尝试在 leetcode 编辑器中运行时,它为以下输入 (00000000000000000000000000001011) 返回了错误答案。

除了打印到控制台之外,没有真正简单的调试方法,所以我在进入方法时打印了 n 的值,得到的结果是 11 而不是 1011 - 在我的 PC 上我得到了 11。如果我采用不同的解决方案 - 使用按位右移或以 2 计算模数的解决方案,那么即使打印的 n 仍然是 11,它也能正常工作。考虑到 n 是“错误的”(与我的 PC 和所描述的网站不同),我预计这些解决方案也会失败。

我是否遗漏了一些有关 uint 表示的知识?还是 uint 变量中的二进制数?

最佳答案

您的代码似乎将其处理为以 10 为基数(十进制),但汉明权重约为 以 2 为基数(即二进制)。所以:如果执行 % 10/= 10,您应该查看 % 2/= 2.

至于什么 uint 看起来像二进制:本质上 like this ,但是……允许 CPU 确定每个八位字节的实际位置(也称为“字节顺序”)。好消息是:它通常不会向你揭穿这个谎言,除非你通过查看原始内存来作弊并深入了解。只要您使用常规运算符(包括按位运算符):谎言就不会被发现。


旁注:对于检查位和向下打乱数据的二进制工作,& 1>> 1 通常比 % 更可取2/2。但正如 canton7 所指出的那样:还有针对这种特定场景的内置操作,它尽可能使用 CPU 内部指令(但是:使用内置函数并不能帮助您增加理解!)。

关于c# - uint 的二进制表示是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827535/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com