「x」ビット数の変数があります。特定のビット グループを抽出して C で作業するにはどうすればよいですか?
4 に答える
これは、一連の 2 つのビット単位の論理演算で行います。
[[用語 MSB (msb) は最上位ビットです。LSB (lsb) は最下位ビットです。ビットが lsb==0 からいくつかの msb (たとえば、32 ビット マシンでは 31) まで番号付けされていると仮定します。ビット位置 i の値は、整数の 2^i コンポーネントの係数を表します。]]
たとえば、 がありint x
、x[31..0] ビットから 4 ビット フィールド x[7..4] など、ある範囲のビット x[msb..lsb] を抽出したい場合、それから:
x を lsb ビットだけ右にシフトすることにより、たとえば
x >> lsb
、x の lsb ビットを式の 0 番目 (最下位) ビットに置きます。これは必要な場所です。ここで、msb で指定されたビットより上の残りのビットをマスクする必要があります。このようなビットの数は msb-lsb + 1 です。式 で長さ 1 のビットのビット マスク文字列を形成できます
~(~0 << (msb-lsb+1))
。例: ~(~0 << (7-4+1)) == ~0b111111111111111111111111110000 == 0b1111.
すべてをまとめると、次の式を使用して、必要なビット ベクトルを新しい整数に抽出できます。
(x >> lsb) & ~(~0 << (msb-lsb+1))
例えば、
int x = 0x89ABCDEF;
int msb = 7;
int lsb = 4;
int result = (x >> lsb) & ~(~0 << (msb-lsb+1));
// == 0x89ABCDE & 0xF
// == 0xE (which is x[7..4])
わかる?
ハッピーハッキング!
プリミティブを扱っている場合は、ビット演算を使用してください。
int bits = 0x0030;
bool third_bit = bits & 0x0004; // bits & 00000100
bool fifth_bit = bits & 0x0010; // bits & 00010000
x
些細なプリミティブよりも大きくなる可能性があるが、コンパイル時に認識されている場合は、次std::bitset<>
のタスクに使用できます。
#include<bitset>
#include<string>
// ...
std::bitset<512> b(std::string("001"));
b.set(2, true);
std::cout << b[1] << ' ' << b[2] << '\n';
std::bitset<32> bul(0x0010ul);
x
コンパイル時に不明な場合はstd::vector<unsigned char>
、実行時にビット操作を使用してから使用できます。それはより多くの作業であり、意図はより明白ではstd::bitset
なく、より遅くなりますが、それは間違いなくx
実行時に変化するための最良のオプションです。
#include<vector>
// ...
std::vector<unsigned char> v(256);
v[2] = 1;
bool eighteenth_bit = v[2] & 0x02; // second bit of third byte
&、| を使用してビットを処理します。<<、>> 演算子。たとえば、値が 7 (整数) で、2 番目のビットをゼロにしたい場合:
7は111
(2 番目のビットをゼロにし、それを 101 (10 進数で 5) にします)
111 & 101 = 101 (5)
コードは次のとおりです。
#include <stdio.h>
main ()
{
int x=7;
x= x&5;
printf("x: %d",x);
}
OR、左シフト、右シフトなどの他の演算子を使用できます。
ユニオンでビットフィールドを使用できます。
typedef union {
unsigned char value;
struct { unsigned b0:1,b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1; } b;
struct { unsigned b0:2,b1:2,b2:2,b3:2; } b2;
struct { unsigned b0:4,b1:4; } b4;
} CharBits;
CharBits b={0},a={0};
printf("\n%d",b.value);
b.b.b0=1; printf("\n%d",b.value);
b.b.b1=1; printf("\n%d",b.value);
printf("\n%d",a.value);
a.b4.b1=15; printf("\n%d",a.value); /* <- set the highest 4-bit-group with one statement */