谁能解释一下这个foor循环是怎么工作的?
for (bitMask = 0x01; bitMask; bitMask <<= 1)
这是我第一次在for循环中遇到这样的语法,很想知道这个循环是如何结束的。
如果你有一个 无符号 int32变量 bitMask
. 在第32个周期,它的位表示是
10000000 00000000 00000000 00000000
然后左移一位,就会溢出,只保留低32位,所以值变成0,循环条件变成假。
1 00000000 00000000 00000000 00000000
↑
this bit is discarded
那如果 bitMask
是一个 签署 int? 那么这就是一个未定义的行为。
C标准(N2716,6.5.7位移运算符)说。
E1 <<E2的结果是E1左移E2位,空出的位用0填充。如果E1具有无符号类型,结果的值是E1×2^E2,比结果类型中可表示的最大值多减一模。如果E1是有符号类型和非负值,并且E1×2^E2在结果类型中是可表示的,那么这就是结果值;否则,行为是未定义的。
C++标准(N4713,8.5.7移位运算符)说。
E1 <<E2的值是E1左移E2位的位置,空出的位为零填充。如果E1具有无符号类型,则结果值是E1×2^E2,比结果类型中可表示的最大值多减一。否则,如果E1有一个有符号类型和非负值,而E1×2^E2在结果类型的相应无符号类型中是可以表示的,那么这个值,换算成结果类型,就是结果值;否则,行为未定义。
我的观点是千万不要使用这种循环,因为我们很容易忘记这只对无符号整数有效。相反,你应该使用类似下面的方法来为每个比特生成掩码。
for (int i = 0; i < 32; i++) {
int bitMask = 1 << i;
}
我认为 数据类型 的bitMask在这里很重要。所以将其视为int。将会发生以下情况。
更简单的可读版本。
for (bitMask = 1; bitMask != 0; bitMask *= 2)