无条件地设置一个 unsigned char 的一位与另一个 unsigned char 的另一位

2024-01-01

我使用按位方式来打开和关闭位:

unsigned char myChar = ...some value
myChar |= 0x01 << N // turn on the N-th bit

myChar &= ~(0x01 << N) //turn off the N-th bit

现在,假设 N 的值已知,但设置/取消设置操作取决于另一个无符号字符的位的值。 从现在开始,我这样做:

if ((otherChar & (0x01 << M)) != 0)
{
    //M-th bit of otherChar is 1
    myChar |= 0x01 << N; 
}else
{
    myChar &= ~(0x01 << N);
}

这应该是一种从无符号字符到另一个无符号字符的“移动位”操作。

我的问题: 有没有什么方法可以在不使用条件的情况下做到这一点? (也没有 std::bitset)


简短的回答是“是”。

更长的答案是您直接使用源中的位:

unsigned char bit = 1 << N;

myChar &= ~bit;             // Zero the bit without changing anything else
myChar |= otherChar & bit;  // copy the bit from the source to the destination.

这假设您要将位 N 从源复制到目标的位 N。如果源位和目标位的偏移量可能不同,事情就会变得更加困难。您不仅要从源中提取正确的位,而且还必须将其移位到正确的位置,然后将其或操作到目标中。基本思想与上面类似,但是移位的代码有点繁琐。问题是你想做类似的事情:

unsigned char temp = source & 1 << M;
temp <<= N - M;
dest |= temp;

如果 N > M,这会很好地工作,但如果 M > N,你最终会得到类似的结果temp <<= -3;。你会做什么like左移 -3 最终会右移 3 —— 但事实并非如此,因此您需要一些条件代码来获取绝对值并确定是否进行右移或左移将位从源获取到目标中的正确位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无条件地设置一个 unsigned char 的一位与另一个 unsigned char 的另一位 的相关文章

随机推荐