首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# - uint的二进制表示是什么样子的?

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

Stack Overflow用户
提问于 2020-01-20 16:37:12
回答 3查看 253关注 0票数 2

我试图解决一个简单的问题关于leetcode.com (https://leetcode.com/problems/number-of-1-bits/),我遇到了一个奇怪的行为,这可能是我缺乏理解.

我对链接中的问题的解决办法如下:

代码语言:javascript
复制
public int HammingWeight(uint n) {
    int sum = 0;
    while (n > 0) {
        uint t = n % 10;
        sum += t == 0 ? 0 : 1;
        n /= 10;
    }
    return sum;
}

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

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

调试其他的方法并不容易,然后打印到控制台,所以我在输入方法时打印了n的值,并得到了11而不是1011的结果--在我的PC上,我得到了11。如果我采用不同的解决方案--一个使用按位右移或在2之前计算mod的解决方案,那么即使打印的n仍然是11,它也能工作。考虑到n是“错误的”(不同于我的个人电脑和所描述的站点),我本以为这些解决方案也会失败。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-20 16:39:32

您的代码似乎正在处理它为基数10 (十进制),但是hamming重量大约是基2 (即二进制)。因此:如果执行% 10/= 10,则应该查看% 2/= 2

至于uint看起来是二进制的:本质上是像这样,但是..。CPU被允许躺在每个八位数的实际位置(也称为"endianness")。好消息是:它通常不会向你暴露那个谎言,除非你通过看原始的记忆来欺骗和看封面。只要使用常规运算符(包括按位运算符),谎言就不会被发现。

附带注意:对于二进制工作,即检查一些数据并向下移动数据,& 1>> 1通常比% 2/ 2更可取。但是正如canton7所指出的:对于这个特定的场景,也有内置的操作,在可能的情况下使用CPU内部指令(但是:使用内置函数无助于提高您的理解!)

票数 9
EN

Stack Overflow用户

发布于 2020-01-20 17:08:35

这个Kata写得不好,在示例中,输入以二进制表示形式打印,而输出以十进制表示形式打印。没有任何线索可以帮助我们理解这一点。

00000000000000000000000000001011b11 (小数,8+2+ 1)。这就是为什么您将11作为第一个测试用例的输入。

这里没有0和1的数字,你必须在这里解码为基2的东西。

要解决Kata问题,您只需要在基础2中工作,就像@MarcGravell解释的那样。

票数 1
EN

Stack Overflow用户

发布于 2022-09-16 04:03:30

请检查下面的代码,它将为您工作。这是非常简单的解决方法。

代码语言:javascript
复制
 var result = 0;
    for(var i = 0; i < 32; i++)
    {
        if ((n & 1) == 1) result++;
        n = n >> 1;
    }
    return result;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59827535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档