4

要するに、 のような 2 進数の数値を扱っていて0000 0110、最後の 3 ビットだけを逆にしたい場合、これを に変換する方法はあります0000 0011か?

reverse bits methodが実装されているが、整数を反転して返す (つまり0110 0000、 ではない)という他の質問やリソースを見てきました0000 0011

標準的な方法で行われるように、それを逆にして、必要なだけシフトするだけで十分でしょうか? または、これを達成するためのより直接的な方法はありますか?

フォーマット:unsigned int reverse_select_bits(int number, int num_bits) { ... }

4

3 に答える 3

1

簡単な参照

http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObviousを参照してください。これは、実際にどのように行うべきかを確認するための良い出発点です。そこに書かれているいくつかのかなり楽しいテクニックがあります。特にご覧ください

http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64Bits

これらの問題についてどのように考えるかを理解する。

ヒントA

任意のワードサイズの場合、マスクを使用して保存したいビットをマスクアウトした後、明らかな方法を使用します。

typeof(word) preserve_mask = \
     ((1 <<  8*sizeof(word)) - 1) & ~(typeof(word))((1 << K) - 1);

ここで、K は「反転」したいビット数です。preserve_mask は、反転させたくない単語の部分を保存するためのマスクを提供します。上記は実際には C コードではなく、実装する必要がある概念であることに注意してください。まず、CPU の制限内で実行することをお勧めします。後で任意の精度を処理します (必要な場合のみ)。

ヒントB

ReverseByteWith64Bits の一般化を使用して、これを任意の長さで行う方法がわかりますか?

N ≢ 0 (mod 8) の場合、N ビットで少しずつ実行できますか? ヒント A の結果を使用できますか?

さらにサポートが必要な場合はお知らせください

于 2013-05-22T03:31:28.073 に答える
0

3 ビット反転するだけなので、8 エントリのテーブルを用意するのが最も簡単な方法です。

int rev_table[8] = {0, 4, 2, 6, 1, 5, 3, 7};
int rev_last_three_bits(int v) {
    return (v & (~7)) | rev_table[v&7];
}
于 2013-05-22T02:53:03.913 に答える
-1

char 内の特定の 2 つのビットを交換できる関数を実装しました。

この関数を使用して、ビットの任意のセクションを反転できます。

#include<stdio.h>
void swap_bits(char *a,unsigned char p1,unsigned char p2)
{
    if (p1==p2) return;//don't need swap
    unsigned char bit1=(1<<p1)&(*a);//access the bit in position 1(0-indexed);
    unsigned char bit2=(1<<p2)&(*a);//access the bit in position 2(0-indexed);
    (*a)^=bit1;//set the bit in position 1 to 0.
    if (bit2) (*a)^=1<<p1;// if bit2 is 1 then set the bit in position to 1 
    (*a)^=bit2;
    if (bit1) (*a)^=1<<p2;
}
int main()
{
    char a=0x06;
    swap_bits(&a,0,2);
    printf("%x\n",a);
}
于 2013-05-22T02:57:53.010 に答える