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

c#-uint的二进制表示是什么样的?,c#,C#,我正试图在leetcode.com()上解决一个简单的问题,我遇到了一个奇怪的行为,这可能是我不理解 我对链接中问题的解决方案如下: public int HammingWeight(uint n) { int sum = 0; while (n > 0) { uint t = n % 10; sum += t == 0 ? 0 : 1; n /= 10; } return sum; } 我的解决方案是分离每

我正试图在leetcode.com()上解决一个简单的问题,我遇到了一个奇怪的行为,这可能是我不理解

我对链接中问题的解决方案如下:

public int HammingWeight(uint n) {
    int sum = 0;
    while (n > 0) {
        uint t = n % 10;
        sum += t == 0 ? 0 : 1;
        n /= 10;
    }
    return sum;
}
我的解决方案是分离每个数字,如果是一,则增加
。当我在我的电脑上运行它时,它工作了(是的,我知道这不是最佳解决方案,考虑到它的二进制表示,还有更优雅的解决方案)

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

除了打印到控制台之外,没有真正简单的调试方法,因此我在输入方法时打印了
n
的值,并得到了
11
的结果,而不是
1011
——在我的PC上我得到了
11
。如果我采用另一种解决方案,即使用按位右移或按2计算mod,那么即使打印的
n
仍然是
11
,它仍然有效。考虑到
n
是“错误的”(与我的PC和所描述的站点不同),我本以为这些解决方案也会失败


我是否缺少一些关于
uint
表示的知识?或
uint
变量中的二进制数?

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

至于什么
uint
看起来是二进制的:本质上,但是。。。CPU被允许对每个八位字节的实际位置进行定位(也称为“endianness”)。好消息是:它通常不会向你揭露谎言,除非你作弊,并通过查看原始内存来掩盖真相。只要使用正则运算符(包括位运算符):谎言就不会被发现



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

这个Kata的书写能力很差,在示例中,输入以二进制表示,而输出以十进制表示。没有任何线索可以帮助理解这一点

0000000000000000000101b
11
(十进制,8+2+1)。这就是为什么第一个测试用例的输入是
11

在10进制中没有0和1构成的数字,你必须在这里解码为2进制


要解决Kata问题,您只需在成功完成任务时使用base 2,就像@MarcGravel所解释的那样。

我想知道他们是否允许
返回System.Numerics.BitOperations.PopCount(n)…示例中的值以二进制表示形式打印<代码>1011b
为“11”。您应该使用base 2来解决这个可怕的Kata(40%的反对票)。@canton7:它产生错误CS0234:名称空间'System.Numerics'@Orace中不存在类型或名称空间名称'BitOperations',这是一个错误shame@Orace如果您使用的是.NETCore3.1Thanks,请尝试
System.Runtime.Intrinsics.X86.Popcnt.PopCount(…)
。据我所知,
uint
是未赋值的int-一个没有负数的整数,因此可以达到比int更高的(重复)数。我错了吗?如果不是,那么是什么让它在这种情况下充当base2数字而不是base10数字呢?@developer82,因为计算机处理的是位;位可以是开或关-1或0。又名二进制。例如,5-的二进制表示是:101(4=on,2=off,1=on)。汉明重量是关于计算“开”位。00001011示例的意思是:数字11(8+2+1),汉明重量为3千克。我理解二进制的工作原理。我的问题是专门了解它在c#中是如何工作的。例如,当我看到一个方法接受
uint
时,我希望传递一个数字给它,而不是二进制的数字表示。因此,根据我目前的理解,通过
00001010
将等同于数字
1010
。但在上面的例子中,它似乎没有这样做,而是将其作为二进制文件进行互穿,在本例中,二进制文件的计算结果为
10
。所以我想知道c#是如何以这种方式工作的。@developer82 c#的工作原理与这里的所有其他编程语言完全相同。当你说“通过00001010”时,我们需要弄清楚:你是指“十进制00001010”(即一千零十),还是指“二进制00001010”(即十)?对于C#,
uint
只是一个纯数字(抽象概念)——没有任何关联的“二进制字符串”/“十进制字符串”等;我们对这个数字是什么样子有了一些想法——这纯粹是在我们丰富的想象力中,或者在
ToString()
code中。那么:您在这里实际测试的是什么数字?是否有不同的方法将数字与二进制传递给
uint
变量?顺便说一句,
public int-HammingWeight(uint n)=>(int)(n==0?0:HammingWeight(n>>1)+n%2)在性能方面达到100%的最高水平。