3

我以这种方式使用按位打开和关闭位:

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 )

4

3 回答 3

3

简短的回答是“是”。

更长的答案是您直接从源代码中使用该位:

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。如果源位和目标位可能处于不同的偏移量,事情就会变得更加困难。您不仅从源中提取了正确的位,而且还必须将其移动到正确的位置,然后将其 OR 到目标。基本思路和上面差不多,但是移位的代码有点繁琐。问题是您想要执行以下操作:

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

如果 N > M,这将正常工作,但如果 M > N,你最终会得到类似temp <<= -3;. 您希望-3 的左移最终作为 3 的右移 - 但这不是发生的情况,因此您需要一些条件代码来获取绝对值并确定是否进行右移移位或左移以将位从源移到目标中的正确位置。

于 2012-06-23T15:40:09.760 回答
3

一种解决方案是首先始终取消设置该位,然后按位或在otherChar.

于 2012-06-23T15:40:42.250 回答
3

这会读取 c1 的from位并将其写入 c2 的to位。

#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
于 2012-06-23T16:06:40.717 回答