向左移位 3 如何得到以字节为单位的位数?

noo*_*tor 1 c c++ bit

我正在学习位打包和位缓冲区,并且遇到了这行代码

int NumBits = sizeof(float) << 3
Run Code Online (Sandbox Code Playgroud)

现在输出是正确的,浮点数是 4 个字节,当你将其转换为位时,它是 32 位,这是NumBits

我的问题是向左移位 3 位如何给出正确的值?

他们也可以用相反的方式做到这一点,将实际值NumBits向右移动 3

int numbytes = NumBits >> 3;
Run Code Online (Sandbox Code Playgroud)

Cem*_*lat 6

sizeof(float) 返回浮点数的大小(以字节为单位)。在大多数系统(例如PC)中,一个float为4个字节,因此sizeof(float)等于4。

<< 运算符是左移运算符。当您将某个值左移一定数量的位数时,实际上是将该值乘以 2 的移位位数次方。在本例中,左移 3 位,因此相当于乘以 2^3,即 8。

因此,sizeof(float) << 3 相当于 4 << 3,等于 32。

总之,左移 3 与乘以 8 相同,得到位数。同样,右移 3 与除以 8 相同。

  • @noob-cryptor 不要做这种事情,写出乘法。编译器很可能会将其转换为移位,但在源代码中将其清楚地写出来。除了教授移位 &lt;-&gt; 乘法运算等价性之外,没有理由这样做。 (3认同)
  • @CemPolat 使用“*”,因为您需要乘以“CHAR_BIT”才能获得可移植结果 (2认同)