SheepDev

数値・単位・ビット

13というフラグ値には、どの設定が入っている?

使うツール

ログにflags=13と出ていても、13という値だけでは、どの設定が有効か分かりません。ビットフラグなら、1、2、4、8のように各桁へ割り当てた機能を一つの整数にまとめています。ここでは8ビット・符号なしという小さな条件に固定し、値を読む、特定の桁を調べる、付ける、外すという順に試します。機能名は説明用であり、実際のシステムの権限や設定を変更するものではありません。

13を二進数にすると、三つの桁が立っている

8ビットで読む設定値
13 = 8 + 4 + 1
00001101
       1 → option A
     100 → option C
    1000 → option D

進数変換で10進数13を2進数へ変えると1101です。8ビットで並べるなら左へ0を補って00001101となり、右から1、4、8の桁が有効です。右端をbit 0と数える規則なら、bit 0、bit 2、bit 3が立っています。『4のフラグ』と『4番目のビット』は同じとは限らないため、仕様書が値と位置のどちらを示しているか確認します。

二進数へ変えても、各ビットの機能名までは分かりません。同じ13でも、別のアプリではまったく違う設定かもしれません。まず『A=1、B=2、C=4、D=8』のような対応表を元の仕様で確認します。ビット演算はその表に沿った確認を助けますが、見知らぬ数値から意味や安全性を推定するツールではありません。

ANDで、知りたい桁だけを取り出す

フラグが立っている場合と、いない場合
13 AND 4 = 4
13 AND 2 = 0
13 AND 6 = 4

ビット演算で幅8、符号なし、入力基数10、演算ANDを選び、入力を13と4にします。結果4は、4のビットが元の値にも存在することを示します。二つ目を2へ変えると0なので、2のビットはありません。ANDの結果はtrue/falseという文字ではなく、両方で1になっている桁を残した整数です。

複数のフラグをまとめて調べるときは、結果が0でないだけでは『すべて有効』と判断できません。6は2と4の組合せですが、13 AND 6の結果は4です。どちらかは有効でも、両方ではありません。すべて必要なら結果がマスク6と一致するか、一つでもあればよいなら0以外か、という判定の違いがあります。権限チェックのような場面では、この違いを先に決めます。

ORは付ける操作。足し算とは違う

同じフラグを二度指定する実験
13 OR 2 = 15
15 OR 2 = 15
13 + 2 = 15
15 + 2 = 17

2のフラグを有効にしたいなら、13 OR 2で15になります。もう一度15 OR 2を行っても15のままです。すでに立っているビットをそのまま残すためです。最初の一回だけ見ると足し算と同じ結果ですが、15+2は17で、桁上がりによって別のビットが変わります。フラグを付ける処理を足し算で代用すると、再実行で壊れる理由がここにあります。

実際の設定値を更新する前に、元の値、付けたいマスク、結果を並べて確認します。元から有効だった1、4、8が結果にも残り、追加した2だけが増えたと二進数で確認できます。この画面が行うのは計算だけであり、サーバーの設定ファイルや端末の権限を自動変更することはありません。

XORで消えたからといって、削除操作とは限らない

反転とクリアの違い
13 XOR 4 = 9
9 XOR 4 = 13
13 AND 251 = 9
9 AND 251 = 9
251 = 11111011 (8 bits)

13 XOR 4は9になるので、4のフラグを外せたように見えます。しかし9 XOR 4では13へ戻ります。XORは指定した桁を反転する操作なので、消えていれば付け直します。チェックボックスの状態を明示的にOFFへそろえたいのか、現在の状態から反転したいのかで、選ぶ操作が違います。

8ビットで4だけを消すマスクは11111011、10進数では251です。13 AND 251でも9 AND 251でも9になるので、繰り返しても消した状態が保たれます。251は8ビットという条件で作った値です。幅が変われば全体のマスクも変わるため、別のビット幅のコードへ数字だけ持ち込まないようにします。

幅と符号を固定して、結果を元の仕様へ戻す

この例では8ビットの符号なしで計算しました。NOTのように全ビットを反転する操作では、幅8と幅16で結果が違います。また最上位のビットを符号として読む場合、同じビット列でも10進表示が負になることがあります。値だけを共有せず、ビット幅、符号の有無、入力基数、演算、範囲外の扱いも残しておくと、相手が同じ条件を再現できます。

最後に、結果の15が仕様上許された組合せかどうかは別に確認します。ビットとして表現できても、同時に有効にできない設定や予約ビットがあるかもしれません。計算が成功したことを、その設定でアプリが動く保証へ読み替えないでください。ツールで数値の変化を説明できたら、機能の組合せと適用手順は元のシステムの仕様へ戻って判断します。

参考資料

使うツール

使い方・解説 →