ビットシフト演算子はC#で機能しますが、defineマクロは機能しません。
何が起こっているのかを理解するには、値を個別に計算してから列挙型に入れることです。
もちろん、それ|
がビット単位のOR演算子であることはご存知でしょう。そして、オペレーター<<
が行うことは、バイナリを左にシフトすることである場合に備えて:
1 << 16 = 10000000000000000_2 //those are 16 zeroes and _2 indicates binary
順番に:
10000000000000000_2 = 65536
これは、2番目のオペランドで示される回数だけ2を掛けるのと同じです。
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
そうです、それは数に2の累乗を掛けています:
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
}