2013-05-10 103 views
-3

我在C#中嘗試一些位運算符按位恭維,不知道如何讚美計算1爲什麼是1 -2

爲-2輸出。如果我代表1 8位二進制

1 = 00000001

〜1 = 11111110 =這是怎麼評估爲-2?

Sample code that i am using in C# 


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

稱爲負整數,如果你把「二進制負數」到谷歌,你會發現數十億文章。我真的很想知道你認爲從來沒有人寫過這樣的文章。 – zerkms 2013-05-10 11:49:01

+0

[Negative binary numbers](http://www.allaboutcircuits.com/vol_4/chpt_2/3.html) – sloth 2013-05-10 11:51:58

+0

http://en.wikipedia.org/wiki/Signed_number_representations 看看Two的補充。 您使用的是有簽名的號碼。爲了表示負數,許多系統使用二進制補碼。 – Doc 2013-05-10 11:50:29

回答

7

那麼......你希望它是什麼?由於我們使用的是兩補表示這簡直是怎麼一回事:

00000011 = 3 
00000010 = 2 
00000001 = 1 
00000000 = 0 
11111111 = -1 
11111110 = -2 
11111101 = -3 
11111100 = -4 

如果我們將使用一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); 

順便說一句:補補否定運算符與補碼運算符加1(當使用雙補碼錶示法時)相同。

所以:

-x == ~x + 1; 

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

+0

你能告訴我在11111110,右邊的第一個數字是符號位,所以它表示它是負數。現在我應該計算這1111110 =(0 + 2 + 4 +8 .. 7次)來得到答案。 – Charu 2013-05-10 11:52:28

+1

@Charu:當第7位被設置時,它得到值-128。所以公式可以是:2 + 4 + 8 + 16 + 32 + 64 -128。 – 2013-05-10 11:58:01

0
在大多數計算環境(包括C#符號整數: sbyteshortintlong

符號整數使用Two's complement表示代表。在此,第一位表示符號,其餘表示數字。 (0..127從0000 0000..0111 1111開始計數,-128 ..- 1從1000 0000..1111 1111開始計數)

你可能一直期待的是你在按位一個unsigned int的稱讚:

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

如果您的八位代表一個帶符號的值,則僅比特1-7代表的數目,比特8指示的數量是否爲正(0)或負(1)。

要獲得您想要的行爲,您必須使用無符號類型。

0

因爲使用Two's Complement,所有位反轉,並添加一個。所以這是整個過程:

11111110 ; start 
00000001 ; invert 
00000010 ; add one 

來源:link

3

Negative int數字英寸。NET被視爲two's-complement。這意味着:

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

etc;基本上,負x等於2base-x

如果你不想底片,使用uint代替int

1

.NET(和大多數語言)使用two's complement表示負數。在最簡單的解釋中,通過取one's complement(其涉及反轉每個位)並且然後添加1來發現。

您的反演創造了補碼,這被解釋爲一個低於而不是二進制補碼。

0

首先,~運營商就像

~x = -x - 1 

在.NET中,有twos-complement

11111111 = -1 
11111110 = -2