我需要在字节值中修改(!不切换XOR!)特定位。我有:
Formtastic
(例如byte
); b11010010
); 4
或0
)的新值。现在,我需要什么。如果新值为1
,则位[4]必须设置为0
。如果新值为0
,则必须将位[4]设置为1
。
一般部分:
1
这是最简单的方法:
var bitIndex = 4;
var byte = b11010010;
var mask = 1 << bitIndex;
var newValue = 1;
另一种方法允许在没有if(newValue == 1)
byte |= mask; // set bit[bitIndex]
else
byte &= ~mask; // drop bit[bitIndex]
语句的情况下执行此操作,但看起来很难理解:
if else
此处,首先byte = byte & ~mask | (newValue << bitIndex) & mask
代表AND
,第二代bit[bitIndex]
计算AND
的新值,bit[bitIndex]
将OR
设置为计算值,无论是bit[bitIndex]
还是0
。
有没有更简单的方法将特定位设置为给定值?
答案 0 :(得分:1)
这样做的规范方法是:
byte ^= (-newValue ^ byte) & (1 << n);
如果newValue == 1,将设置位号n,如果newValue == 0,则清除位数
答案 1 :(得分:0)
myByte = Convert.ToByte(myByte | (1 << bitNumber));
答案 2 :(得分:0)
(newValue << bitIndex)
仅设置了一个位,不需要& mask
。
所以您只有5次操作。
byte = byte & ~(1 << bitIndex) | (newValue << bitIndex); // bitIndex'th bit becomes newValue
它仍然足够复杂,值得一提,但很容易看出该评论是正确的,因为它是两个容易识别的操作链接在一起的(不同于当前接受的答案,这需要每个读者坐下来思考一下,以得出一个正确的答案)分钟)