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 の値はわかっているが、設定/設定解除操作は別の unsigned char のビットの値に依存するとします。今以来、私はこのようにしています:

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

これは、unsigned char から別の char への一種の「ビットの移動」操作である必要があります。

私の質問:条件を使用せずにこれを行う方法はありますか? (そして std::bitset もなし)

4

3 に答える 3

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 に答える
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

1 つの解決策は、最初に常にビットを設定解除してから、適切にシフトおよびマスクされたバージョンのビット単位の OR を使用することですotherChar

于 2012-06-23T15:40:42.250 に答える