1

いくつかの要件に従って LSB (最下位ビット) を変更して、バッファーの各バイトを編集しようとしています。バイトに unsigned char 型を使用しているので、正しいか間違っている教えてください。

unsigned char buffer[MAXBUFFER];

次に、私はこの機能を使用しています

char *uchartob(char s[9], unsigned char u)

これは、最初のパラメーターをビットの配列として変更して返します。配列内のビットが 2 番目のパラメーターを表すため、この関数は正常に機能します。

ここから面倒なことが始まります。私がやろうとしていることを段階的に指摘するつもりです。

上記の関数(バッファの各要素に対して呼び出される)の結果を変数に保存しています

char binary_byte[9];             // array of bits

上記のようなフラグと比較するだけでLSBをテストしています。

if (binary_byte[7]==bit_flag)     // i go on and modify it like this
binary_byte[7]=0;                // or 1, depending on the case

次に、ビットの配列binary_byte (ビットの配列ですね) を byte/unsigned charに変換し、同時にバッファ内のデータを更新しようとしています。私は今、本当に混乱しているので、私は自分自身を十分に明確にしてくれることを願っています.

buffer[position_in_buffer]=binary_byte[0]<<7| // actualize the current BYTE in the buffer
                        binary_byte[1]<<6|
                        binary_byte[2]<<5|
                        binary_byte[3]<<4|
                        binary_byte[4]<<3|
                        binary_byte[5]<<2|
                        binary_byte[6]<<1|
                        binary_byte[7];

binary_byte[7] の位置のビットが変更される可能性があることに注意してください。これがすべてのポイントです。

ソリューションは本当にエレガントではありませんが、がやったことは本当に不安ですが、うまくいきます(ビットごとの演算子でやろうとしましたが、成功しませんでした)

奇妙なのは、更新された文字をバッファから出力しようとしているときです。以前のキャラクターとビットは同じですが、まったく別のキャラクターです。 ここに画像の説明を入力

私の最後の質問は次のとおりです。バイトの LSB だけを変更すると、どのような影響がありますか? 私は何を期待すべきですか?. ご覧のとおり、取得してはいけない場合でも「新しい」文字しか取得していません。

4

2 に答える 2

3

したがって、ここで何を達成しようとしているのかはまだ少しわかりませんが、バイトの個々のビットを変更しようとしているため、次のデータ構造を使用することを提案します。

union bit_byte
{
    struct{
        unsigned bit0 : 1;
        unsigned bit1 : 1;
        unsigned bit2 : 1;
        unsigned bit3 : 1;
        unsigned bit4 : 1;
        unsigned bit5 : 1;
        unsigned bit6 : 1;
        unsigned bit7 : 1;
    } bits;

    unsigned char all;
};

これにより、バイトの各ビットにアクセスし、バイト表現を取得できます。ここにいくつかの簡単なサンプルコードがあります:

bit_byte myValue;
myValue.bits.bit0 = 1;    // Set the LSB

// Test the LSB
if(myValue.bits.bit0 == 1) {
    myValue.bits.bit7 = 1;
}

printf("%i", myValue.all);
于 2013-04-11T19:13:07.307 に答える
2

ビット単位:

ビットを設定 =>a |= 1 << x;

ビットをリセット =>a &= ~(1 << x);

ビットチェック =>a & (1 << x);

ビットを反転 =>a ^= (1 << x)

これを管理できない場合は、いつでもstd::bitsetを使用できます。

ヘルパー マクロ:

#define SET_BIT(where, bit_number) ((where) |= 1 << (bit_number))

#define RESET_BIT(where, bit_number) ((where) &= ~(1 << (bit_number)))

#define FLIP_BIT(where, bit_number) ((where) ^= 1 << (bit_number))

#define GET_BIT_VALUE(where, bit_number) (((where) & (1 << (bit_number))) >> bit_number)// これは 0 または 1 を返します

ビットを出力するヘルパー アプリケーション:

#include <iostream>
#include <cstdint>

#define GET_BIT_VALUE(where, bit_number) (((where) & (1 << (bit_number))) >> bit_number)

template<typename T>
void print_bits(T const& value)
{
    for(uint8_t bit_count = 0;
        bit_count < (sizeof(T)<<3);
        ++bit_count)
    {
        std::cout << GET_BIT_VALUE(value, bit_count) << std::endl;
    }
}

int main()
{
    unsigned int f = 8;
    print_bits(f);
}
于 2013-04-11T16:55:25.473 に答える