enum
{
kFlag_FPS = 1 << 0,
kFlag_Help = 1 << 1,
kFlag_RedBlue3D = 1 << 2,
}
我试图了解这段代码是什么,我不太清楚:
1 << 0
装置?
非常感谢任何帮助!
答案 0 :(得分:30)
来自MSDN - Shift Operators: >> and <<
左移运算符导致第一个操作数中的位模式为 被第二个指定的位数向左移动 操作数。通过换档操作腾出的位是零填充的。这是 逻辑移位而不是移位和旋转操作。
这意味着用户正在获取1
的位值,并根据正确的数字将位移到左侧。
这意味着在这种情况下,它们的值在二进制文件中看起来像这样。
1 << 0 = `0000 0001`
1 << 1 = `0000 0010`
1 << 2 = `0000 0100`
第一个班次没有必要,但看起来与其他班次更加一致。
答案 1 :(得分:6)
1 << 0
向左移动了0个位置,只有1个位置。
答案 2 :(得分:4)
<<
运算符有点移位。因此,当您1 << 2
并移位4
位时,1
等于2
。使用1 << 0
时,这对价值没有影响,可能会使所有内容都显得一致
答案 3 :(得分:3)
x << y
- 表示x向左移位(到较大值)y次。
在数学中,这看起来像:
x * (2^y)
或x * pow(2, y)
答案 4 :(得分:2)
可能只是
enum
{
kFlag_FPS = 1,
kFlag_Help = 1 << 1,
kFlag_RedBlue3D = 1 << 2,
}
但编码员喜欢更加对称。
答案 5 :(得分:0)
>> (Signed right shift)
如果数字为负,则将1用作填充符,如果数字为正,则将0用作填充符。
int x = -4;
System.out.println(x>>1); //output -2
int y = 4;
System.out.println(y>>1); //output 2
>>> (Unsigned right shift)
在Java中,运算符“ >>>”是无符号右移运算符。无论数字的符号如何,它始终填充0。
// x使用32位2的补码形式存储。
// -1的二进制表示全为1(111..1)
int x = -1;
System.out.println(x>>>29); // The value of 'x>>>29' is 00...0111
System.out.println(x>>>30); // The value of 'x>>>30' is 00...0011
System.out.println(x>>>31); // The value of 'x>>>31' is 00...0001
答案 6 :(得分:0)
这是一种随意遵循一种模式(我认为)的冗余操作。
tl;dr 它只是 1
1 作为 int 32 是:
00000000 000000000 00000000 00000001
1 << 1 将所有东西向左移动一次,产生 2
00000000 000000000 00000000 00000010
因此, 1 << 0 将所有内容向左移动零次,产生不变的 1
00000000 000000000 00000000 00000001
对于那些在枚举中使用它的人:
enum {
firstOption = 0,
secondOption = (1 << 0),
thirdOption = (1 << 1),
// etc.
}
为了避免引用此页面,如果您真的想维护一个模式(无论出于何种原因),最好这样做:
enum {
firstOption = (0 << 0),
secondOption = (1 << 0),
thirdOption = (1 << 1),
// etc.
}
但这对我来说似乎有点傻。我只是更喜欢:
enum {
firstOption = 0,
secondOption = 1, // was that so hard?
thirdOption = (1 << 1),
// etc.
}
具有讽刺意味的是 1 << 0 是为了澄清,但我们都在这里。