0

キーと呼ばれる別のバイトの最下位ビットに応じて、特定の入力バイト c1 のビットを変更する関数を作成しようとしています。

key の最下位ビットに 1 がある場合、対応するミラー ビット位置に従って c1 のビットを交換する必要があります。

たとえば、

key = 0110 1010、最下位ビットとして 1010 だけを気にします。

c1 = 0010 1011

1010 によると、c1 の 1 番目の位置を 6 番目に、3 番目の位置を 4 番目に交換する必要があります。

c1 は 0111 0001 になるはずです。

これは私がこれまでに行ったことです:

unsigned char swapBits(unsigned char c1, unsigned char key){
    for(int i = 0; i < 4; i++){
            key = (key >> i);
            if(key & 1){
               /* swap bits here */
            }
    }
    return c1;
}

どうすればこれを達成できますか?

どんな助けでも感謝します。

4

2 に答える 2

1
#include <stdint>    // uint8_t
#include <limits.h>  // CHAR_BIT

uint8_t furtle(uint8_t val, uint8_t key) 
{
    uint8_t mask_lo = 0x01;                  // init masks at LS and MS bits
    uint8_t mask_hi = mask_lo << (CHAR_BIT - 1);
    for (int b = 0; b < CHAR_BIT / 2; ++b)
    {
        if (key & mask_lo)                   // if bit b is set in val
        {
            uint8_t b_lo = val & mask_lo;    // get corresponding low/high bits
            uint8_t b_hi = val & mask_hi;    // and swap them
            val = (val & ~mask_lo) | (b_hi >> (CHAR_BIT - b * 2 - 1));
            val = (val & ~mask_hi) | (b_lo << (CHAR_BIT - b * 2 - 1));
        }
        mask_lo <<= 1;                       // shift masks
        mask_hi >>= 1;
    }
    return val;
}
于 2012-10-12T02:19:15.103 に答える
-2

すべてのビットを配列に挿入してから、要素を交換できます。

最後に、すべての要素を出力として読み取るか、string.concat 関数を使用して 3 つの要素を文字列に追加します。

于 2012-10-12T01:54:15.763 に答える