-3

我正在 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);
4

7 回答 7

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);

顺便说一句:反补否定运算符与补运算符加一相同(使用二补语表示时)。

所以:

-x == ~x + 1;

欲了解更多信息:http ://en.wikipedia.org/wiki/Signed_number_representations

于 2013-05-10T11:48:56.133 回答
3

.NET 中的负数int被视为二进制补码。这意味着:

1111....111111 = -1
1111....111110 = -2
1111....111101 = -3
1111....111100 = -4

ETC; 基本上,负数x等于2base-x

如果您不想要底片,请使用uint而不是int

于 2013-05-10T11:50:41.950 回答
1

.NET(和大多数语言)使用二进制补码来表示负数。在最简单的解释中,这是通过取一个的补码(这涉及反转每个位)然后添加来找到的1

您的反转创建了一个补码,它被解释为比二进制补码一个。

于 2013-05-10T11:52:50.260 回答
0

大多数计算上下文中的有符号整数(包括 C# 中的有符号整数:sbyteshortintlong)使用二进制补码表示。其中,第一位表示符号,其余位表示数字。(0..127 从 0000 0000..0111 1111 开始计数,-128..-1 从 1000 0000..1111 1111 开始计数)

你可能一直期待的是你会得到一个无符号整数的按位恭维:

uint b = 1;
uint a = (uint)~b;
// a == 4294967294, which is 2^32-2, or in binary,
// 11111111 11111111 11111111 11111110
于 2013-05-10T11:50:09.620 回答
0

如果您的 8 位表示有符号值,则只有 1-7 位表示数字,第 8 位表示数字是正数 (0) 还是负数 (1)。

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

于 2013-05-10T11:50:10.673 回答
0

因为使用二进制补码,您将所有位反转并加一。所以这是整个过程:

11111110 ; start
00000001 ; invert
00000010 ; add one

来源:链接

于 2013-05-10T11:50:27.280 回答
0

首先,~运营商的工作方式类似于

~x = -x - 1

在 .NET 中,使用二进制补码调用负整数

11111111 = -1
11111110 = -2
于 2013-05-10T11:53:15.040 回答