C# 为什么按位恭维是1/2

C# 为什么按位恭维是1/2,c#,C#,我正在尝试C中的一些位运算符,不确定恭维如何将输出计算为-2:1 如果我用8位二进制表示1 1=00000001 ~1=1111111 0=这怎么算得上是-2 Sample code that i am using in C# //Bitwise Compliment //1 = 00000001 //~1 = 11111110 = -2 Console.WriteLine(~1); 嗯。。。你希望它是什么?由于我们使用的是两个互补表示法,因此简单

我正在尝试C中的一些位运算符,不确定恭维如何将输出计算为-2:1

如果我用8位二进制表示1

1=00000001

~1=1111111 0=这怎么算得上是-2

    Sample code that i am using in C#


    //Bitwise Compliment
    //1  = 00000001
    //~1 = 11111110 = -2
    Console.WriteLine(~1);

嗯。。。你希望它是什么?由于我们使用的是两个互补表示法,因此简单地说就是这样:

00000011 = 3
00000010 = 2
00000001 = 1
00000000 = 0
11111111 = -1
11111110 = -2
11111101 = -3
11111100 = -4
如果我们使用one complient表示法,我们会有以下列表,那么您是对的:

00000011 = 3
00000010 = 2
00000001 = 1
00000000 = 0
11111111 = -0 <== Watch this!!!
11111110 = -1
11111101 = -2
11111100 = -3
顺便说一句:当使用两个补语表示法时,反补语否定运算符与补语运算符加1相同

因此:


有关更多信息:

大多数计算上下文中的有符号整数,包括C中的有符号整数:sbyte、short、int和long使用表示法表示。在这种情况下,第一位表示符号,其余位表示数字。0000 0000..0111 1111中的0..127计数,以及1000 0000..1111 1111中的-128..-1计数

您可能期望得到的是无符号int的按位补充:

uint b = 1;
uint a = (uint)~b;
// a == 4294967294, which is 2^32-2, or in binary,
// 11111111 11111111 11111111 11111110

如果八位表示有符号值,则只有代表数字的位1-7,位8表示数字是正0还是负1


要获得所需的行为,必须使用无符号类型。

因为使用2的补码,可以反转所有位,然后添加一位。这就是整个过程:

11111110 ; start
00000001 ; invert
00000010 ; add one
来源:.

NET中的负整数被视为。这意味着:

1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4
等等,;基本上,负x等于2base-x


如果你不想要负数,可以用uint代替int,大多数语言都用它来表示负数。在最简单的解释中,这是通过取包含反转每个位然后加1的

你的倒装生成一的补码,它被解释为比二的补码低一个。

首先,运算符的工作原理如下

~x = -x - 1
在.NET中,使用


如果你把二进制负数输入谷歌,你会发现数十亿篇文章。我真的很奇怪你认为没有人写过关于这个的文章。看二的补语。你使用的是有符号的号码。为了表示负数,许多系统使用2的补码。好的,你能告诉我在11111110中,右边的第一个数字是符号位,所以它表示负数。现在我应该计算这个1111110=0+2+4+8。。7次得到答案。@Charu:当设置位7时,它得到值-128。所以公式是:2+4+8+16+32+64-128。
1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4
~x = -x - 1
11111111 = -1
11111110 = -2