在uint中动态设置多个位

时间:2014-09-03 05:45:04

标签: c bit-shift

我有一个unsigned int,它包含一系列位和一个位位。

现在我想将该位从“位”向下“设置为1”。如何在没有循环的情况下实现这一目标?

示例:

unsigned int bitloc=2;
unsigned int bits=??;           //must become 0000 0111

unsigned int bitloc=4;
unsigned int bits=??;           //must become 0001 1111

创建结果的等效函数:

bits=0;
for (unsigned int i=0; i<=bitloc; i++)
    bits|=1<<i;

4 个答案:

答案 0 :(得分:2)

怎么样?

unsigned int  Mask =   0xffffffff;
  bits = Mask >> (31 - bitloc);

在你的例子中bitloc是2: 掩码是二进制数,然后我们向右移动29次,有效地从左边增加29个零,只留下第0位和第2位作为1。

  

0xffffffff&gt;&gt; 29 = 0x00000007 = 000 ... 0111

答案 1 :(得分:0)

怎么样

bits |= (2 << bitloc) - 1;

当然,这只适用于bitloc <= 30

答案 2 :(得分:0)

我希望这应该有用,

bits |= ~((~0)<<(bitloc + 1))

答案 3 :(得分:0)

以下是针对您的问题的更通用的解决方案

假设你想从M.S.B中的特定位置“P”设置“N”位。在给定值“X”中朝向LSB。然后解决方案将是

X = X | ((〜(~0