C# 为什么按位恭维是1/2
我正在尝试C中的一些位运算符,不确定恭维如何将输出计算为-2:1 如果我用8位二进制表示1 1=00000001 ~1=1111111 0=这怎么算得上是-2C# 为什么按位恭维是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); 嗯。。。你希望它是什么?由于我们使用的是两个互补表示法,因此简单
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