我正在尝试使用C#中的一些按位运算符,不确定恭维如何计算输出为-2为1
如果我用8位二进制表示1
1 = 00000001
~1 = 11111110 =为什么评价为-2?
Sample code that i am using in C#
//Bitwise Compliment
//1 = 00000001
//~1 = 11111110 = -2
Console.WriteLine(~1);
答案 0 :(得分:7)
嗯......你希望它是什么?由于我们使用两个补充表示,因此它就是这样的:
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
由于计算机制造商决定不会出现负零,因此他们创建了双补码表示。
如果执行按位补码,则所有位都反转。因此00000001
会产生11111110
,而这只是-2(使用双补码时)。
您是否正在寻找否定运算符-
?
Console.WriteLine(-1);
BTW:De complement negate运算符与补码运算符加1(使用双补语表示时)。
所以:
-x == ~x + 1;
了解更多信息:http://en.wikipedia.org/wiki/Signed_number_representations
答案 1 :(得分:3)
.NET中的否定int
数字被视为two's-complement。这意味着:
1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4
等;基本上,否定x
等于2
base
-x
如果您不想要否定,请使用uint
代替int
答案 2 :(得分:1)
.NET(和大多数语言)使用two's complement来表示负数。在最简单的解释中,可以通过one's complement(包括反转每个位)然后添加1
来找到它。
你的反演会产生一个补码,它被解释为一个低而不是两个补码。
答案 3 :(得分:0)
大多数计算上下文中的有符号整数(包括C#中的有符号整数:sbyte
,short
,int
和long
)都使用Two's complement表示表示。在此,第一位表示符号,其余表示数字。 (0..127计数从0000 0000..0111 1111,-128 ..- 1计数从1000 0000..1111 1111)
你可能期待的是你对无符号int的按位赞美所得到的:
uint b = 1;
uint a = (uint)~b;
// a == 4294967294, which is 2^32-2, or in binary,
// 11111111 11111111 11111111 11111110
答案 4 :(得分:0)
如果您的8位代表有符号值,则只有1-7位表示数字,第8位表示该数字是正数(0)还是负数(1)。
要获得所需的行为,您必须使用无符号类型。
答案 5 :(得分:0)
因为使用Two's Complement,所以反转所有位,并添加一个。所以这就是整个过程:
11111110 ; start
00000001 ; invert
00000010 ; add one
来源:link。
答案 6 :(得分:0)