ビットを設定、クリア、切り替えるにはどうすればいいですか?
ベストアンサー1
少し設定する
ビット単位の OR 演算子 ( |
)を使用して、n
のビットnumber
を に設定します1
。
// Can be whatever unsigned integer type you want, but
// it's important to use the same type everywhere to avoid
// performance issues caused by mixing integer types.
typedef unsigned long Uint;
// In C++, this can be template.
// In C11, you can make it generic with _Generic, or with macros prior to C11.
inline Uint bit_set(Uint number, Uint n) {
return number | ((Uint)1 << n);
}
幅を超えてシフトすると未定義の動作になることに注意してくださいUint
。残りのすべての例にも同じことが当てはまります。
少し晴れる
ビット単位の AND 演算子 ( &
)を使用して、n
の 番目のビットをnumber
に設定します0
。
inline Uint bit_clear(Uint number, Uint n) {
return number & ~((Uint)1 << n);
}
ビット文字列をビット単位の NOT 演算子 ( ~
) で反転してから、AND 演算を行う必要があります。
少し切り替える
ビット単位の XOR 演算子 ( ) を使用して、の 番目のビット^
を切り替えます。n
number
inline Uint bit_toggle(Uint number, Uint n) {
return number ^ ((Uint)1 << n);
}
ちょっと確認
これは頼まれてないけど、追加してもいいかも。
ビットをチェックするには、number
n
右にシフトしてからビット単位の AND を実行します。
// bool requires #include <stdbool.h> prior to C23
inline bool bit_check(Uint number, Uint n) {
return (number >> n) & (Uint)1;
}
n番目のビットをxに変更する
より悪いコード生成による代替手段もありますが、最善の方法は、 のようにビットをクリアしてからbit_clear
、 と同様にビットを値に設定することですbit_set
。
inline Uint bit_set_to(Uint number, Uint n, bool x) {
return (number & ~((Uint)1 << n)) | ((Uint)x << n);
}
すべてのソリューションは、GCCとclangで最適なコード生成を提供するためにテストされています。https://godbolt.org/z/Wfzh8xsjW。