位移的循环

问题描述 投票:1回答:2

谁能解释一下这个foor循环是怎么工作的?

for (bitMask = 0x01; bitMask; bitMask <<= 1)

这是我第一次在for循环中遇到这样的语法,很想知道这个循环是如何结束的。

c++ c for-loop bit
2个回答
4
投票

如果你有一个 无符号 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;
}

3
投票

我认为 数据类型 的bitMask在这里很重要。所以将其视为int。将会发生以下情况。

  1. bitMask将被初始化为1。
  2. 每一次迭代都会将bitMask的位值移动1位。例如:1 = 00001(位数取决于平台。考虑32位)左移1将得到00010,等于值2。
  3. 这将为bitMask产生以下的值序列。 1,2,4,16,...直到值为1的位超过32位的大小。
  4. 一旦溢出,该值就会变成Undefined的值。.如果认为bitMask是 无符号Int 因为现在所有的位子都是0,使得for循环中的条件为false & break。

更简单的可读版本。

for (bitMask = 1; bitMask != 0; bitMask *= 2)
© www.soinside.com 2019 - 2024. All rights reserved.