设置有点unsigned char型的另一个无符号的字符的另一位没有条件(Setting a bit

2019-09-18 10:00发布

我使用位转位和关闭是这样的:

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的太)

Answer 1:

简短的回答是“是”。

较长的答案是,你直接从源使用位:

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右移-但是这不是发生什么事情,所以你需要一些有条件的代码来取绝对值,并找出是否做了正确的移或左移来从源头位到目的地的正确位置。



Answer 2:

一种解决方案是第一始终未设置该位,然后按位或在一个适当地移位和掩蔽版本otherChar



Answer 3:

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