如何在没有循环的情况下设置字节中的位

时间:2017-11-20 12:00:20

标签: c++ c bit-manipulation

我真的很困惑,但似乎不能做简单的任务:

我只需要在字节中设置位数。

例如:

我需要设置5位。所以我需要0xb00011111

没有循环可以做到这一点吗?

此外,我也不想写很多#defines

3 个答案:

答案 0 :(得分:9)

对于小于单词中位数的任何整数n,您需要的掩码为:

const unsigned int mask = (1u << n) - 1;

不需要循环。

使用此功能的简单功能:

unsigned int set_lsbs(unsigned int n)
{
  return (1u << n) - 1;
}

第一个结果是:

0: 0x0
1: 0x1
2: 0x3
3: 0x7
4: 0xf
5: 0x1f
6: 0x3f
7: 0x7f
8: 0xff
9: 0x1ff

注意:语法0xb00011111不是二进制文字,'b'只是被解释为十六进制数字。

答案 1 :(得分:2)

可以通过生成掩码来为任何整数类型设置最低有效5位:

mask = ~((~0u) << 5) ;

这将创建一个整数值,其中最低有效5位设置为1,所有高阶位都不管整数类型设置为0。

特别针对所讨论的8位类型:

uint8_t mask = ~((~0u) << 5) ;

解释这是如何工作的(忽略大于8位的中间整数类型):

  • ~0u(恭维为零)= 0x11111111
  • 然后换了5 = 0x11100000
  • 最后还是那个= 0x00011111
  • 的补充

答案 2 :(得分:0)

是的,给定数字中的set n位可能没有循环而不是random位,您可以设置n consecutive位。

用于设置single位给定不,我们写的是    num = num | 1 << pos; 为什么1?因为我只想设置single位,同样也可以设置5位。

用于设置5位否定您可以使用以下逻辑

     `num = num | 31 << pos` ;

为什么31?因为我想设置five位(31 = 1x2 ^ 0 + 1x2 ^ 1 + ..或31是5个的总和)