はじめに
特定のビット位置にデータを設定したいと思った時に、どのようにコードを書けば良いでしょうか?
例えば、1バイトデータの中で6ビット目に1という値を入れたいというケースです(以下にデータを記載)
00010000
↑5ビット目に1を設定する
このように特定のビット位置にデータを設定したい場合の方法を試行錯誤したので、その記録を残したいと思います。
特定のビット位置にデータを設定する方法
特定のビット位置にデータを設定する方法として挙げられるのが、 シフト演算子(<<)を利用する方法 です。
例えば、5ビット目に1を設定したい場合は、0x01データに対して4ビット分だけ左シフトすれば良いです。以下に実際のコードを載せています。
// 5bit目に1を設定したいので、4ビット(5-1)分だけ左シフトする
const bit = 0x01 << (5 - 1);
// bit: 16(=0b00010000)
複数のビット位置にデータを設定する方法
次に、複数のビット位置にデータを設定する方法を考えます。
例えば、以下のように5ビット目と7ビット目にそれぞれ1を設定する場合です。
01010000
↑ ↑
5と7ビット目に1を設定したい
複数のビット位置にデータを設定する場合は、シフト演算子(<<)に加えて、 ビット論理和(|) を利用すれば実現できます。以下に実際のコードを載せています。
let bit = 0x00;
// 5ビット目に1を設定したデータと、論理和を計算する
bit = bit | 0x01 << (5 - 1);
// 7ビット目に1を設定したデータと、論理和を計算する
bit = bit | 0x01 << (7 - 1);
// > bit: 80(=0b01010000)
ビット論理和は、前後のデータの各ビット位置を比較し、どちらか一方のビットが1である場合に1、それ以外は0を返す演算子です。
今回の計算を図で表すと以下の通りです。
5ビット位置に1を設定する
bit = bit | 0x01 << (5 - 1)
0b00000000 // bit
0b00010000 // 0x01 << (5 - 1)
-----------
0b00010000 // ビット論理和の結果(bit | 0x01 << (5 - 1))
7ビット位置に1を設定する
bit = bit | 0x01 << (7 - 1)
0b00010000 // bit (=上述で5ビット目に1を設定した結果)
0b01000000 // 0x01 << (7 - 1)
-----------
0b01010000 // ビット論理和の結果(bit | 0x01 << (7 - 1))
ビット論理和を用いることで前の計算結果を利用できるため、複数のビット位置に値を設定することができるようになります。
参考文献
JavaScript | ビット演算子/シフト演算子 | Let'sプログラミング
↧