这是我能想到的设置变量的各个位的最佳方法:假设我们需要将 variable1(char 或其他字节长变量)的前四位设置为 1010
variable1 &= 0b00001111; //Zero the first four bytes
variable1 |= 0b10100000; //Set them to 1010, its important that any unaffected bits be zero
这可以扩展到所需的任何位,方法是在与您希望设置的位相对应的第一个数字中放置零(在示例的情况下为前四个),并在与您希望保留的位相对应的第二个数字中放置零第二个数字中性(示例中的最后四个)。第二个数字也可以通过将您想要的值移位适当数量的位置(在示例的情况下为四个)来导出。
根据您的评论,可以进行如下修改以适应增加的可变性:
对于此操作,假设您希望能够修改非起始位和非结束位,我们将需要两个班次。在这种情况下有两组位,第一组(从左起)不受影响的位和第二组。如果您希望修改从左侧跳过第一位的四位(将这四个位111 用于单个字节),则第一个移位将是 7,第二个移位将是 5。
variable1 &= ( ( 0b11111111 << shift1 ) | 0b11111111 >> shift2 );
接下来,我们希望分配的值需要进行移位和或运算。但是,我们需要第三次移位来说明我们要设置多少位。这种转变(我们称之为shift3
)shift1
减去我们希望修改的位数(如前所述 4)。
variable1 |= ( value << shift3 );