ElectroDesignForgeElectroDesignForge
ElectroDesignForge

ページを探す

PCB設計ツール
電子部品
回路設計
ピン配置・コネクタ

ケーブル

技術資料
計算ツール

変換ツール

矢印キーで移動 · Enterで開く · Escで閉じる

基礎信号とインターフェース

数の表現とビット演算 — 完全ガイド

基数変換、ビットマスク、2の補数、整数の範囲、レジスタ操作を、組込みシステムの具体例とともに学びます。

基数変換ツールで以下の例を再現できます。2進数・10進数・16進数・8進数は、異なる数字で同じ整数を表します。電子回路では2進数を論理状態やレジスタに、16進数をバイト列やアドレスに、10進数を測定値に使用します。8進数は3ビットのまとまりやアクセス権のマスクに適しています。

1. 基数と位取り

2進数は0〜1、8進数は0〜7、10進数は0〜9、16進数は0〜9とA〜Fを使用し、A = 10、F = 15です。基数bの各桁をdᵢとすると、値は N = Σ dᵢ × bⁱ です。右端をi = 0とします。先頭のゼロは数学的な値を変えませんが、レジスタ幅を示すことがあります。

DECBINHEXOCT
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000810
91001911
101010A12
111011B13
121100C14
131101D15
141110E16
151111F17

2. 基数変換の手順

2進数から10進数へ: 各桁に2の累乗を掛けて加えます。10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀ です。

10進数から2進数へ: 2で繰り返し割り、余りを記録します。13の場合、13 = 2×6+1; 6 = 2×3+0; 3 = 2×1+1; 1 = 2×0+1 です。余りを下から上に読むと1101になります。同様に 255₁₀ = 11111111₂ = FF₁₆ = 377₈ です。

2進数から16進数へ: 右から4桁ずつ区切り、必要なら左端にゼロを補います。1010 1011 1100 1101₂ = ABCD₁₆ です。16 = 2⁴なので、4ビットが16進数1桁に対応します。

16進数から2進数へ: 各桁を4ビットに置き換えます。0x2F → 0010 1111₂ → 47₁₀ です。英字の大文字と小文字は同じ値を表します。

8進数: 8 = 2³なので右から3桁ずつ区切ります。11111111₂ → 011 111 111₂ = 377₈ です。逆に 17₈ → 001 111₂ = 15₁₀ となります。位取りでは 377₈ = 3×8² + 7×8 + 7 = 255 です。10進数から8進数へは8で繰り返し割り、余りを逆順に読みます。

3. 算術演算と正確な整数

基数が異なっても演算は同じです。0x0F + 0b1 = 16、20 − 7 = 13、0o7 × 0x3 = 21 です。2進数の加算は各桁の和が2になると繰り上がります。0111 + 0001 = 1000 です。

本ツールは変換と計算にBigIntを使用し、2⁵³ − 1を超えても整数を正確に扱います。整数除算はゼロ方向に切り捨てるため −7 ÷ 3 = −2 です。%は常に非負の剰余を返す演算ではなく、被除数の符号に従うため −7 % 3 = −1 です。bがゼロでなければ a = (a / b) × b + (a % b) が成り立ちます。ゼロによる除算と剰余はエラーです。

4. AND・OR・XOR・NOT

ANDは両方が1のビットを残し、ORはどちらかが1なら1にします。XORは異なるビットに対して1を返し、NOTは選択した幅の全ビットを反転します。各ビット位置を独立に処理します。

ABA AND BA OR BA XOR BNOT A
000001
010111
100110
111100

8ビットの例では、11111111 & 00001111 = 00001111(15)、10100000 | 00001111 = 10101111(175)、10101010 ^ 11111111 = 01010101(85)です。符号なし8ビットの00001111をNOTすると11110000(240)になります。自動モードには有限のマスクがなく、~x = −x − 1 なので ~15 = −16 です。

5. 符号付き整数と2の補数

符号なしwビットの値は Σ bᵢ2ⁱ、範囲は 0 … 2ʷ−1 です。2の補数では最上位ビットの重みが −2ʷ⁻¹ となり、範囲は −2ʷ⁻¹ … 2ʷ⁻¹−1 です。最上位ビットが1なら、符号なしの値から2ʷを引きます。

8ビットでは FF = 255 − 256 = −1、80 = 128 − 256 = −128 です。−5を表すには00000101を反転して11111010とし、1を加えて11111011 = FBにします。16ビットではFFFFが−1です。2の補数は幅に依存する2進表現であり、別の基数ではありません。

ビット数符号なし符号付き
80 … 255−128 … 127
160 … 65535−32768 … 32767
320 … 4294967295−2147483648 … 2147483647
640 … 18446744073709551615−9223372036854775808 … 9223372036854775807

DECは数学的な値です。固定幅の非負BIN・HEX・OCT入力はビットパターンなので、符号付き8ビットのHEX FFはDEC −1になりますが、DEC 255は範囲外です。負の入力は数学的な値として指定範囲に収まる必要があります。入力を黙って切り詰めることはありません。10進数以外の出力はゼロで桁を補います。8進数の最上位桁には最大2ビットの未使用部分があります。

自動モードでは固定幅も符号なしの範囲も設けません。負の値は符号と絶対値で表示します。ビット表示は絶対値の下位128ビットまでですが、変換とコピーは整数全体を保持します。

6. シフトとオーバーフロー

無限幅でkビット左シフトすると2ᵏ倍になります。0x01 << 4 = 0x10 = 16 です。固定幅では 2ʷ−1 でマスクします。符号なし8ビットの 0x80 << 1 は正確な値が256、格納結果が0となり警告します。符号付きの 0x40 << 1 は−128となり、正確な値128が範囲外なので警告します。

論理右シフトは上位にゼロを挿入します。符号なし8ビットでは FF >> 1 = 7F = 127 です。算術右シフトは符号を拡張します。符号付き8ビットでは FF >> 1 = FF = −1、80 >> 1 = C0 = −64 です。負数の算術右シフトは負の無限大方向に丸めるため −3 >> 1 = −2 となり、整数除算 −3 / 2 = −1 とは異なります。

Bは以前の基数設定やワード幅に関係なく10進数の非負シフト数で、0〜65536を受け付けます。この制限は1回の処理量を抑えるもので、入力整数の精度は制限しません。シフト数を32やワード幅の剰余に変換しません。符号なし8ビットを8ビット右シフトすると0です。符号なし8ビットの255 + 1や符号付きの−128 / −1など、算術オーバーフローは正確なDEC結果を表示して拒否します。自動モードは無限幅の符号付きBigInt演算に従います。

7. STM32レジスタ・マスク・フラグ

STM32F407のGPIO入力レジスタからピン状態を取得できます。クロックと周辺回路を設定した後、CMSISデバイスヘッダを用いる例です。

uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;

snapshotが0xB0ならpin5は1、ビット7:4は0xB = 11です。BSRRへの書込みはODRをソフトウェアで読出し・変更・書込みせずに出力ビット5をセットします。ただし外部出力はピンモードにも依存します。クロック、予約ビット、1を書いてクリアするフィールドは該当機種のマニュアルで確認してください。1回のスナップショットにより、異なる時刻の読出しを混在させずに済みます。

次はローカルな符号なし変数に対するフラグ操作です。

uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;

0x08のマスクはビット3を選択します。ORはセット、補数とのANDはクリア、XORは反転、最後の式は状態確認です。共有メモリやハードウェアレジスタの読出し・変更・書込みが自動的にアトミックになるわけではありません。仕様にある機構や適切な同期を使用してください。

8. CAN・UART・SPI・ADC・FPGAへの応用

0x12と0x34の2バイトをプロトコルで定義されたビッグエンディアンとして読むと、(0x12 << 8) | 0x34 = 0x1234 = 4660 です。リトルエンディアンなら0x3412 = 13330です。CANのフィールドはメッセージ仕様やDBCで定義されます。UARTのフレーム形式やSPIのビット順序だけでは、複数バイトのアプリケーション値のバイト順序は決まりません。UARTガイドとSPIガイドも参照してください。

符号なし12ビットADCでは0xABC = 2748は0〜4095の範囲内です。Vref = 3.3 Vで端点を対応させる表示用の近似は 2748 × 3.3 / 4095 ≈ 2.2145 V です。これは厳密な量子化特性ではありません。理想ステップは3.3/4096 Vで、実際の特性はADC仕様に依存します。符号付きデータは2の補数やオフセットバイナリの場合があります。符号化とビット配置を確認し、ADC/DAC計算器を使用してください。

FPGAやマイコンでは幅と符号を明示します。SystemVerilogの 8'hFF は符号なし8ビットパターン、8'shFF は符号付き−1です。サイズ指定のないリテラル、式の幅、型昇格で結果が変わる場合があります。本ツールのマスク処理はC/C++やHDLの全型規則を再現するものではありません。

9. よくある質問

2進数を16進数に変換するには?

右から4ビットずつ区切り、各組を0〜Fに置き換えます。1111 0000はF0です。必要なら左端をゼロで補います。

符号付き整数と符号なし整数の違いは?

符号なしはすべてのビットで非負の値を表します。2の補数では最上位ビットに負の重みがあります。8ビットのFFは符号なしで255、符号付きで−1です。

2の補数はどのように動作しますか?

wビットの負数は2ʷにその値を加えて符号化します。正の絶対値をビット反転し、選択した幅の中で1を加える方法と同じです。

ビット単位のXORとは?

入力ビットが異なる位置で1になります。マスクとのXORは指定位置だけを反転します。AA XOR FFは55です。

レジスタから特定のビットを取り出すには?

対象フィールドを右にシフトし、その幅のマスクでANDします。ビット7:4なら (reg >> 4) & 0x0F です。ハードウェアの読出し仕様に従ってください。

FFが−1になるのはなぜですか?

幅に依存します。8ビットのFFは符号ビットが1なので−1ですが、16ビットの00FFは+255です。

10. 技術資料