我使用位转位和关闭是这样的:
unsigned char myChar = ...some value
myChar |= 0x01 << N // turn on the N-th bit
myChar &= ~(0x01 << N) //turn off the N-th bit
现在,假设N的值是知道,但设置/取消操作取决于位另一个unsigned char型的值。 因为现在,我做的是这样的:
if ((otherChar & (0x01 << M)) != 0)
{
//M-th bit of otherChar is 1
myChar |= 0x01 << N;
}else
{
myChar &= ~(0x01 << N);
}
这应该是从unsigned char类型到另一种“移动位”的操作。
我的问题:有没有这样做,而不使用条件的方法吗? (和没有的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;
。 你想什么会是-3左移最后形成的3右移-但是这不是发生什么事情,所以你需要一些有条件的代码来取绝对值,并找出是否做了正确的移或左移来从源头位到目的地的正确位置。
一种解决方案是第一始终未设置该位,然后按位或在一个适当地移位和掩蔽版本otherChar
。
这从 C1位读取和写入到到 C2位。
#include <stdio.h>
typedef unsigned char uchar;
uchar move_bit(uchar c1, int from, uchar c2, int to)
{
int bit;
bit = (c1 >> from) & 1; /* Get the source bit as 0/1 value */
c2 &= ~(1 << to); /* clear destination bit */
return (uchar)(c2 | (bit << to)); /* set destination bit */
}
int main()
{
printf("%02X\n",move_bit(0x84,3,0x42,5));
printf("%02X\n",move_bit(0x81,0,0x03,7));
printf("%02X\n",move_bit(0xEF,4,0xFF,6));
return 0;
}
结果:
42
83
BF
文章来源: Setting a bit of an unsigned char with the another bit of another unsigned char without conditional