10 進値がある場合: 123
とそのバイナリ バージョン: 01111011
int
このバイトから左端の 4 ビットと右端の 4 ビットを 2 つの個別の変数に取得するにはどうすればよいですか?
つまり:
int a = 7; // 0111 (the first four bits from the left)
int b = 11; // 1011 (the first four bits from the right)
とても有難い!
10 進値がある場合: 123
とそのバイナリ バージョン: 01111011
int
このバイトから左端の 4 ビットと右端の 4 ビットを 2 つの個別の変数に取得するにはどうすればよいですか?
つまり:
int a = 7; // 0111 (the first four bits from the left)
int b = 11; // 1011 (the first four bits from the right)
とても有難い!
int x = 123;
int low = x & 0x0F;
int high = (x & 0xF0) >> 4;
これは、マスキングとシフトと呼ばれます。(これは binaryです) でAND
ing することにより、上位 4 ビットを削除します。(バイナリ) を使用すると、下位 4 ビットが削除されます。次に (後者の場合)、4 ビットだけ右にシフトします。つまり、下位 4 ビットを押しのけ、上位 4 ビットだけを残します。0xF
00001111
AND
0xF0
11110000
以下のコメントで @owlstead が述べているように、上位ビットを取得する別の方法があります。下位ビットをマスクしてからシフトする代わりに、シフトするだけです。
int high = x >> 4;
下位ビットはマスクする必要がないことに注意してください。なぜなら、下位ビットが何であれ、それらは消えてしまったからです (それらを押し出しました)。上記の例は、最初に明示的にゼロにするのでより明確ですが、この特定の例ではそうする必要はありません。
しかし、16 ビット (通常は 32 ビット) より大きい数値を処理するには、さらに上位の 16 ビットが邪魔になるint
可能性があるため、マスクする必要があります。
int high = (x >> 4) & 0x0F;