我發現這段代碼:(1U << X)做什麼?
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
};
什麼是(1U << X)
嗎?
我發現這段代碼:(1U << X)做什麼?
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
};
什麼是(1U << X)
嗎?
它設置位掩碼:
1U << 0 = 1
1U << 1 = 2
1U << 2 = 4
etc...
什麼情況是1U(無符號值1)由x位左移。
您發佈的代碼等價於:
enum
{
IsDynamic = 1U, // binary: 00000000000000000000000000000001
IsSharable = 2U, // binary: 00000000000000000000000000000010
IsStrong = 4U // binary: 00000000000000000000000000000100
}
位移位。而不是說a = 1,b = 2,c = 4,他們移位。 這個想法是將許多標誌打包成一個整數(或長整數)。
這實際上是一個非常乾淨的方法。
< <是位位移運算符。它將採用左側的位並將其移位右側指定的量。例如:
1 << 1 -> 0b0001 << 1 => 0b0010
1 << 2 -> 0b0001 << 2 => 0b0100
等
1U
是一個無符號的值與單個位0組,並且所有其它位清零。運營商的意思是「向左移動」。 1U << 0
表示創建一個位0的值; 1U << 1
表示用位1設置創建一個值;等
即片斷
enum
{
IsDynamic = (1U << 0), // ...
IsSharable = (1U << 1), // ...
IsStrong = (1U << 2) // ...
}
聲明瞭將被推測用作在其上包含多個標誌的值的掩模2的冪的值的枚舉。
因此,例如,代表東西值IsDynamic和IsSharable是
unsigned value = IsDynamic | IsSharable; // could use + as well
而且測試是否值IsStrong
if (value & IsStrong) { ... }