Arduino-Bits and Bytes関数(ビット・バイト関数)の使い方
当記事では、ArduinoのBits and Bytes関数(ビット・バイト関数)の使い方について詳しく解説します。
Bits and Bytes関数を使うことによって、ビットやバイトの操作をすることができます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
Bits and Bytes関数(ビット・バイト関数)
関数 | 引数 | 戻り値 | 説明 |
---|---|---|---|
uint8_t lowByte(x) | x:対象の数値 | 下位Bitを返す | 下位Bitを取得 |
uint8_t highByte(x) | x:対象の数値 | 上位Bitを返す | 上位Bitを取得 |
boolean bitRead(x, n) | x:対象の数値 n:取得するBitの桁 | 取得Bitを返す | 指定Bitを取得 |
void bitWrite(x, n, b) | x:対象の数値 n:取得するBitの桁 b:指定値(0または1) | なし | 特定の桁を変更した値を取得 |
void bitSet(x, n) | x:対象の数値 n:1にするBitの桁 | なし | 特定の桁を1に変更した値を取得 |
void bitClear(x, n) | x:対象の数値 n:0にするBitの桁 | なし | 特定の桁を0に変更した値を取得 |
bit(n) | n:指定Bitの桁 | 指定した桁のBitを1にした値を返す | 指定した桁のBitを1にした値を取得 |
lowByte()/下位Bitを取得
- 関数:uint8_t lowByte(x)
- 引数:x⇒対象の数値
- 戻り値:下位Bitを返す
lowByte()関数は、引数で指定した数値の下位Bitを戻り値として返します。
highByte()/上位Bitを取得
- 関数:uint8_t highByte(x)
- 引数:x⇒対象の数値
- 戻り値:上位Bitを返す
highByte()関数は、引数で指定した数値の上位Bitを戻り値として返します。
bitRead()/指定Bitを取得
- 関数:boolean bitRead(x, n)
- 引数:x⇒対象の数値
- :n⇒取得するBitの桁
- 戻り値:取得Bitを返す
bitRead()関数は、引数に対象の数値と取得するBitの桁を指定して、戻り値で取得Bitを返します。
bitWrite()/特定の桁を変更した値を取得
- 関数:void bitWrite(x, n, b)
- 引数:x⇒対象の数値
- :n⇒取得するBitの桁
- :b⇒指定値(0または1)
- 戻り値:なし
bitWrite()関数は、引数に対象の数値、Bitの桁、Bitに書き込む数値(0または1)を指定して、Bitの桁を0または1にした数値に変更します。
bitSet()/特定の桁を1に変更した値を取得
- 関数:void bitSet(x, n)
- 引数:x⇒対象の数値
- :n⇒1にするBitの桁
- 戻り値:なし
bitSet()関数は、引数に対象の数値とBitの桁を指定して、Bitの桁を1にした数値に変更します。
bitClear()/特定の桁を0に変更した値を取得
- 関数:void bitClear(x, n)
- 引数:x⇒対象の数値
- :n⇒0にするBitの桁
- 戻り値:なし
bitClear()関数は、引数に対象の数値とBitの桁を指定して、Bitの桁を0にした数値に変更します。
bit()/指定した桁のBitを1にした値を取得
- 関数:bit(n)
- 引数:n⇒指定Bitの桁
- 戻り値:指定した桁のBitを1にした値を返す
bit()関数は、戻り値として、引数で指定した桁のBitを1にした値を返します。
サンプルプログラム(サンプルスケッチ)
- Arduino Uno
- USBケーブル
- PC(プログラム書き込み・シリアルモニタ表示)
lowByte()/下位Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char low_byte;//「low_byte」をunsigned charで変数宣言
low_byte = lowByte(0xF3A1);//「0xF3A1」の下位ビットを取得して「low_byte」に代入
Serial.print("LowByte: ");//文字列「LowByte: 」を送信
Serial.println(low_byte, HEX);//数字「low_byte」をHEXで送信、改行
delay(1000);//1秒待機(1000msec待機)
}
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
LowByte: A1
サンプルプログラムは、lowByte()関数の引数に0xF3A1を指定して、戻り値で下位Bitの0xA1を返します。
highByte()/上位Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char high_byte;//「high_byte」をunsigned charで変数宣言
high_byte = highByte(0xF3A1);//「0xF3A1」の上位ビットを取得して「high_byte」に代入
Serial.print("HighByte: ");//文字列「HighByte: 」を送信
Serial.println(high_byte, HEX);//数字「high_byte」をHEXで送信、改行
delay(1000);//1秒待機(1000msec待機)
}
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
HighByte: F3
サンプルプログラムは、highByte()関数の引数に0xF3A1を指定して、戻り値で上位Bitの0xF3を返します。
bitRead()/指定Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1, bit2;//「bit1」、「bit2」をunsigned charで変数宣言
bit1 = bitRead(0b0101, 0);//「0101」のLSBから1桁目を取得して「bit1」に代入
Serial.print("0101のLSBから1桁目: ");//文字列「0101のLSBから1桁目: 」を送信
Serial.println(bit1);//数字「bit1」を送信、改行
bit2 = bitRead(0b0101, 3);//「0101」のLSBから4桁目を取得して「bit2」に代入
Serial.print("0101のLSBから4桁目: ");//文字列「0101のLSBから4桁目: 」を送信
Serial.println(bit2);//数字「bit2」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
0101のLSBから1桁目: 1
0101のLSBから4桁目: 0
0101のLSBから1桁目: 1
0101のLSBから4桁目: 0
0101のLSBから1桁目: 1
0101のLSBから4桁目: 0
0101のLSBから1桁目: 1
0101のLSBから4桁目: 0
0101のLSBから1桁目: 1
0101のLSBから4桁目: 0
サンプルプログラムは、bitRead()関数によって、指定Bitを取得します。bit1は「0101」のLSBから1桁目「1」、bit2は「0101」のLSBから4桁目「0」をそれぞれ取得します。
bitWrite()/特定の桁を変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101, bit2=0b1101;//「bit1」、「bit2」をunsigned charで変数宣言
bitWrite(bit1, 2, 0);//bit1「1101」のLSBから3桁目を「0」に変更
Serial.print("1101のLSBから3桁目を0に変更: ");//文字列「1101のLSBから3桁目を0に変更: 」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
bitWrite(bit2, 1, 1);//bit2「1101」のLSBから2桁目を「1」に変更
Serial.print("1101のLSBから2桁目を1に変更: ");//文字列「1101のLSBから2桁目を1に変更: 」を送信
Serial.println(bit2, BIN);//数字「bit2」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから3桁目を0に変更: 1001
1101のLSBから2桁目を1に変更: 1111
1101のLSBから3桁目を0に変更: 1001
1101のLSBから2桁目を1に変更: 1111
1101のLSBから3桁目を0に変更: 1001
1101のLSBから2桁目を1に変更: 1111
1101のLSBから3桁目を0に変更: 1001
1101のLSBから2桁目を1に変更: 1111
1101のLSBから3桁目を0に変更: 1001
1101のLSBから2桁目を1に変更: 1111
サンプルプログラムは、bitWrite()関数によって、特定の桁を変更した値を取得します。bit1は「1101」のLSBから3桁目を「0」に変更した値「1001」、bit2は「1101」のLSBから2桁目を「1」に変更した値「1111」をそれぞれ取得します。
bitSet()/特定の桁を1に変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101;//「bit1」をunsigned charで変数宣言
bitSet(bit1, 1);//bit1「1101」のLSBから2桁目を「1」に変更
Serial.print("1101のLSBから2桁目を1に変更: ");//文字列「1101のLSBから2桁目を1に変更: 」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
1101のLSBから2桁目を1に変更: 1111
サンプルプログラムは、bitSet()関数によって、特定の桁を「1」に変更した値を取得します。bit1は「1101」のLSBから2桁目を「1」に変更した値「1111」を取得します。
bitClear()/特定の桁を0に変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101;//「bit1」をunsigned charで変数宣言
bitClear(bit1, 2);//bit1「1101」のLSBから3桁目を「0」に変更
Serial.print("1101のLSBから3桁目を0に変更: ");//文字列「1101のLSBから3桁目を0に変更: 」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
1101のLSBから3桁目を0に変更: 1001
サンプルプログラムは、bitClear()関数によって、特定の桁を「0」に変更した値を取得します。bit1は「1101」のLSBから3桁目を「0」に変更した値「1001」を取得します。
bit()/指定した桁のBitを1にした値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1, bit2;//「bit1」、「bit2」をunsigned charで変数宣言
bit1 = bit(0);//2進数でLSBから1桁目のBitを「1」にして「bit1」に代入
Serial.print("LSBから1桁目のBitを1: ");//文字列「LSBから1桁目のBitを1: 」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
bit2 = bit(4);//2進数でLSBから5桁目のBitを「1」にして「bit2」に代入
Serial.print("LSBから5桁目のBitを1: ");//文字列「LSBから5桁目のBitを1: 」を送信
Serial.println(bit2, BIN);//数字「bit2」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
LSBから1桁目のBitを1: 1
LSBから5桁目のBitを1: 10000
LSBから1桁目のBitを1: 1
LSBから5桁目のBitを1: 10000
LSBから1桁目のBitを1: 1
LSBから5桁目のBitを1: 10000
LSBから1桁目のBitを1: 1
LSBから5桁目のBitを1: 10000
LSBから1桁目のBitを1: 1
LSBから5桁目のBitを1: 10000
サンプルプログラムは、bit()関数によって、指定した桁のBitを「1」にした値を取得します。bit1はLSBから1桁目のBitを「1」にした値「1」、bit2はLSBから5桁目のBitを「1」にした値「10000」をそれぞれ取得します。
おすすめのArduinoボードはどれ?
当記事『Arduino-Bits and Bytes関数(ビット・バイト関数)の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。