2012-10-12 19 views
5

我試圖將C++代碼中的枚舉轉換爲C#代碼,並且在繞過它時遇到了問題。在C++代碼:將C++中的某些位移碼複製到C#

enum FOO { 
    FOO_1 = 0, 
    FOO_2, 
    // etc 
} 

#define MASK(x) ((1 << 16) | (x)) 

enum DISP 
{ 
    DISP_1 = MASK(FOO_1), 
    DISP_2 = MASK(FOO_2), 
    // etc 
} 

什麼我不明白是什麼面具是幹什麼的,我怎麼可以模仿C#中的功能,或者明白它在做什麼,並手動設置枚舉DISP沒有它。

我不知道我在說什麼是有道理的,但是當我不完全確定我在看什麼時,這是可以預料的。

+0

你應該閱讀有關移位(<<)和或(|)在C++這樣你就可以明白這是怎麼回事運營商。 – coredump

+0

我絕對會! – Wint

回答

5

MASK(x)構建一批由OR在一些x用二進制數10000000000000000(一個左移16次)-ing。

在C#,可以直接使用表達式,如下所示:

enum FOO { 
    FOO_1 = 0, 
    FOO_2, 
    // etc 
} 

enum DISP 
{ 
    DISP_1 = (1<<16) | (int)(FOO.FOO_1), 
    DISP_2 = (1<<16) | (int)(FOO.FOO_2), 
    // etc 
} 
+0

這正是我所期待的。謝謝你的例子! – Wint

2

只需更換MASK有什麼它定義爲(在C#中存在<<|運營商太):

enum DISP 
{ 
    DISP_1 = ((1 << 16) | FOO.FOO_1), 
    DISP_2 = ((1 << 16) | FOO.FOO_2) 
} 

如果你想知道到底是什麼轉變,還是運營商做,你」重新獲取0000000000000001的二進制值,並將其左移16個值:1000000000000000

另一個例子,(000001101 << 3)變成001101000

的或操作者通吃1倍的值從一個操作數,並且將結果的爲1

的值。例如,0001 | 0110變得0111

那麼,採取DISP_2:

(0b00000000000000001 << 16) | 0b00000000000000010) 
= (0b10000000000000000 | 0b00000000000000010) 
= (0b10000000000000010) 
= 65538 

(我知道0b格式不C#中工作,不C標準,但它是更有益使用的二進制符號,而不是十六進制,更容易看什麼運營商正在做的)

7

時位移位時,它使所有的1和0的向左或向右的一些數目的值。

你的情況1 << 16創建二進制10000000000000000。 (是的,這是16個零)。

然後它取得該數字並使用|這是位運算符。因此,無論枚舉的整數值是什麼,它都會被逐位移入該位數。

例如,如果使用MASK(FOO_4)(文字值爲3),則3是11進制,因此結果將爲10000000000000011。這與向每個值添加65,536的功能相同。

現在,當我們聲明第二個枚舉時,我們將這些枚舉值的值設置爲這個奇怪的遮罩函數。

要做到同樣的事情,在C#中試試這個:

enum Foo { //this may not be needed anymore? 
    FOO_1 = 0, FOO_2, ... etc 
} 

enum Disp { //DISP_2 gets the next value ie 65536 + 1, and so forth 
    DISP_1 = 65536, DISP_2, DISP_3, ... etc 
+1

你不需要+ 1,+ 2等,剩下的將從開始指定的那個順序分配。 DISP_1是唯一需要分配顯式值的人(並且從0開始,甚至不需要指定FOO_1)。 – jrajav

+0

良好的通話,你是對的。我忘了那個。就像PHP – ohmusama

+0

「很像C/C++」可能更相關;) – jrajav

0

是DISP_X相等的數值:

DISP_1 == 0x10000 
DISP_2 == 0x10001 
DISP_3 == 0x10002 
... 
0

的位移位操作符在C#中,但定義宏沒有按」噸。

要理解你可以做的是分別計算值,然後將它們放入枚舉中。

當然你知道|是按位或運算符。以防萬一有什麼操作<<確實是二進制左移:

1 << 16 = 10000000000000000_2 //those are 16 zeroes and _2 indicates binary 

依次爲:

10000000000000000_2 = 65536 

由2 mutiplying數量由表示的次數的quivalent第二個操作數。

1 << 1 = 2 
1 << 2 = 4 
1 << 3 = 8 

這是正確的,它是由二的冪數乘以:現在

1 << 1 <=> 1 * 2^1 = 2 
1 << 2 <=> 1 * 2^2 = 4 
1 << 3 <=> 1 * 2^3 = 8 

,由於FOO_1 = 0然後

DISP_1 = MASK(FOO_1) 
=> 
DISP_1 = ((1 << 16) | (FOO_1)) 
=> 
DISP_1 = (65536 | (FOO_1)) 
=> 
DISP_1 = (65536 | FOO_1) 
=> 
DISP_1 = (65536 | 0) 
=> 
DISP_1 = 65536 

做同樣的FOO_2我拿有值1會給你:

DISP_2 = (65536 | FOO_2) 
=> 
DISP_2 = (65536 | 1) 
=> 
DISP_2 = 65537 

隨着下列工作正常說:

enum FOO 
{ 
    FOO_1 = 0, 
    FOO_2, 
    // etc 
} 

enum DISP 
{ 
    DISP_1 = (1<<16) | (int)(FOO.FOO_1), 
    DISP_2 = (1<<16) | (int)(FOO.FOO_2), 
    // etc 
}