我正在阅读Objective-C中的教程,但它使用了C / C ++的一些东西。我有这行代码:
static const uint32_t projectileCategory = 0x1 << 1;
所以我想知道为什么变量等于2,如果我可以把它写成
static const uint32_t projectileCategory = 0x2;
谢谢!
答案 0 :(得分:4)
这称为左bit shift,它是一个按位运算,相当于你的第二个例子。
0x1 << 1
将值0x1
1的位向左移动,产生两个。
0x1: 00000001
0x2: 00000010 <- product of 0x1 << 1
0x4: 00000100 <- product of 0x1 << 2
答案 1 :(得分:3)
他们是一样的,正如其他人所说的那样。但有时如果你有许多常量对应于位域中的位,你会看到它是用位移来写的,以澄清它对应的位。原始代码中的间距似乎表明它是更大的定义集的一部分。例如:
static const uint32_t projectileCategory = 0x1 << 1;// bit 1
static const uint32_t doodadCategory = 0x1 << 2;// bit 2
static const uint32_t playerCategory = 0x1 << 3;// bit 3
static const uint32_t doorCategory = 0x1 << 4;// bit 4
这可以说比将它们设置为2,4,8和16更清晰。
答案 2 :(得分:2)
0x1 << 1
和0x2
相同。 0x1(00000001) << 1 => 0x2(00000010)
&#34;静态&#34;部分将其范围限制为compilation unit。它还提供静态初始化。 &#34; const的&#34;只是告诉编译器不要让任何人修改它。根据体系结构,此变量可以放在数据段或bss段中,也可以在内存中标记为只读。
答案 3 :(得分:0)
(0x1 << 1)
和
0x02
是两个表达式,它们使用相同的类型计算相同的值。