2012-04-18 22 views
1

我寫了一個QuadTree類,我需要包含鄰居搜索。我正在跟隨包含C實現的this paper。 (我基本上將它轉換爲C#)。而且我遇到了麻煩,因爲我不擅長處理二進制數字。我需要做以下的事情:C#中的按位加法和減法類似於C

給定#100和#010,結合他們得到#110。 1s永遠不會重疊。現在我所做的是存儲100和10,當我添加它時,它會給我110.

在數字(如#011)上執行左和右二進制移位。現在我正在存儲011並將>>或< <運算符應用到它。這給了我完全錯誤的數字,但奇怪的是,我用它找到常見的四叉樹父母的邏輯工作得很好。

給定#011和#001總和他們得到#100。現在我正在存儲11和1,這顯然根本不起作用 。

執行逐位減法,與上述相同,但 - 代替+ :)

執行與運算,OR和異或。

所以,現在我將所有東西都存儲爲一個看起來像二進制值的整數,而數學似乎適用於AND,OR,XOR和shift。數字在中間很瘋狂,但我最終得到正確答案。

我正在嘗試一個實現,現在我存儲的整數值是二進制數的值,但我必須來回轉換很多,這是一個特別的痛苦,因爲我在一個整數表示數字的值和二進制數字本身的字符串表示形式。每隔一行代碼創建一個新字符串將成爲性能噩夢。

你們可以推薦一個在C#中使用二進制數的基本策略嗎?

P.S.我永遠不需要看到這些數字的整數表示。我真的不在乎#010 == 2,我需要做的工作將其視爲#010結尾。

希望這比我原來的帖子更清晰!

+0

你怎麼想象按位減法和整數相減是不同的?此外,如果您將數字10存儲在一個int中,則該數字是十進制數,並且不會是二進制數10. – 2012-04-18 21:58:50

+0

不是發佈部分四叉樹,而是在C#和C中編寫一個小控制檯應用程序,並嘗試展示具體差異。 – 2012-04-18 22:02:05

+0

我的回覆評論變得越來越長了,所以我會試着澄清原帖,我感謝你的評論,我以前從未使用過二進制文件。 C和C#可能工作相同,我只是不明白如何工作,所以我也會在控制檯應用程序上工作。 – Eric 2012-04-18 22:13:12

回答

3

我希望這將澄清一些困惑:

  • 字面0x00000001使用十六進制表示法表示1
  • 字面1使用十進制表示法表示1

下面是一些對等效文字的:。

0x9 == 9 
0xA == 10 
0xF == 15 
0x10 == 16 
0x11 == 17 
0x1F == 31 

原始積分數據類型(字節,sbyte,ushort,short,char,uint,int,ulong,long)始終以二進制格式存儲在計算機的存儲器中。下面是利用5位譜寫上述值:

1 == #00001 
9 == #01001 
10 == #01010 
15 == #01111 
16 == #10000 
17 == #10001 
31 == #11111 

現在,考慮:

unsigned int xLeftLocCode = xLocCode - 0x00000001; 

以下或者爲在C#當量:

uint xLeftLocCode = xLocCode - 1; 
uint xLeftLocCode = xLocCode - 0x00000001; 

要分配二進制#10到一個uint變量,請執行以下操作:

uint binaryOneZero = 2; //or 0x2 

十六進制表示法對位操作很有用,因爲十六進制和二進制數字之間存在一對一的對應關係。更準確地,是有一到四個對應關係,作爲各16位十六進制數字表示的四個比特的16種可能的狀態之一:

0 == 0 == 0000 
1 == 1 == 0001 
2 == 2 == 0010 
3 == 3 == 0011 
4 == 4 == 0100 
5 == 5 == 0101 
6 == 6 == 0110 
7 == 7 == 0111 
8 == 8 == 1000 
9 == 9 == 1001 
A == 10 == 1010 
B == 11 == 1011 
C == 12 == 1100 
D == 13 == 1101 
E == 14 == 1110 
F == 15 == 1111 

這因此很容易知道0x700FF,例如具有最低有效字節集的所有位,下一個最高有效字節以及下一個最高有效字節的低三位。如果您使用字面值459007來表示該值,則很難看到該信息。

結論:

你們可以推薦在C#中使用二進制數的工作基本策略是什麼?

瞭解上表,並使用十六進制文字。

+0

謝謝!經過短暫的頭痛,使很多感覺:) – Eric 2012-04-18 23:33:40

2

爲什麼那條感興趣的線在C中按位減法但在C#中是整數相減。

他們都應該這樣做。你爲什麼不這樣想?那麼按位減法是什麼意思?

我將二進制數10存儲爲整數10,而不是整數2.我可能會這樣做都是錯誤的。

是的,這是錯誤的。 #010 == 2,而不是10.

我猜我在尋找什麼是在C#中使用二進制數字的一些基本策略。

總的來說,這些操作應該與C中的相同。

+0

我認爲不然,因爲我的代碼完全錯誤。我的代碼太長,所以我會寫一個簡單的控制檯應用程序。 – Eric 2012-04-18 22:16:19

1

您標記的行與按位任何內容無關。這是1號(表示爲十六進制雙字(DWORD),或無符號長整型(在C#UINT)的直接減法