いくつかのステータスフラグを含むArduinoアプリケーション(実際にはライブラリ)があります。元々はそれらをintとして宣言していました(この場合はuint8_tなので8ビットの符号なし文字)。しかし、それらすべてを1つの整数に結合し、ビットマスク操作を使用してステータスを設定およびテストすることもできます。
前者の例:
if (_shift == HIGH)
{
_shift = LOW;
}
else
{
_shift = HIGH;
}
後者の例
#define SHIFT_BIT 0
if (bitRead(_flags, SHIFT_BIT) == HIGH)
{
bitWrite(_flags, SHIFT_BIT, LOW);
}
else
{
bitWrite(_flags, SHIFT_BIT, HIGH);
}
前者の方が読みやすくなりますが、後者の方が効率的です(空間と時間)。この状況では、スペースと時間の効率が常に優先される必要がありますか、それとも必要な場合にのみ発生する必要がある一種の最適化ですか?
(追加した)
完全を期すために、これらのbitWriteなどのマクロの配線定義を次に示します。
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))