ネットワークの問題で

otoさん  
(No.1)
IPアドレスやサブネットマスクについて問われるケースで、192.168.143.41などを2進数変換する際、効果的な方法はありますでしょうか。

私はIPアドレスの各値に対する2進数表記を記憶していないため、毎回値を2で割って余りを並べて2進数変換しています。

よく見る値の2進数表記は暗記するべきでしょうか。
もしシンプルに変換する手順などあれば教えてください。
2024.02.11 08:07
dさん 
(No.2)
この投稿は投稿者により削除されました。(2024.02.11 08:40)
2024.02.11 08:40
dさん 
(No.3)
10年前くらいに新卒でCCNAの勉強していた時は↓のような感じで計算していました。
2進数は桁が上がると2の0,1,2,3,4,5,6,7乗になるので、1,2,4,8,16,32,64,128
になります。
0000|0001=1
0000|0010=2
0000|0100=4
0000|1000=8
0001|0000=16(以下省略)
基本的に上の(1,2,4,8,16,32,64,128)を組み合わせて計算しているので、求めたい10進数を超えない大きい数が引いていくと計算できるかと思います。
143であれば143-「128」=15、15-「8」=7、7-「4」=3,3-「2」=1、なので
10001111になります。(逆に2進数から10進数にする場合は1+2+4+8+128と、下から足していく)
2024.02.11 08:44
pixさん 
AP シルバーマイスター
(No.4)
掛け算九九のようにある程度のパターンは暗記が必須です。
10進数 -> 2進数変換は一旦16進数を経由します。
1.10進数->16進数 変換
2.16進数->2進数 変換

1.10進数->16進数 変換
以下255までの10進数で、16進数に変換したときの
上位バイトの値【10進数(16進数)】を暗記しておきます。
0(0),16(1),32(2),48(3),
64(4),80(5),96(6),112(7)
128(8),144(9),160(A),176(B),
192(C),208(D),224(E),240(F)
ネットワークでは特に以下3つが重要です。
16(1),128(8),192(C)

例)10進数:143を16進数に変換する場合
方法1(変換暗記を利用した、不等式による挟み込み)
  128(8) < 143 < 144(9)
  ゆえに上位バイトは16進数で8
  下位バイトは143 - 128 = 15, 16進数に変換してF
  結果:8F
  ※16,128,192などのキリのいい数字の場合は
    不等式で挟み込む必要もなく、そのまま16進数の10,80,C0となります。
方法2(単純な割り算)
  143/16 = 8あまり15 
  ゆえに上位バイトは16進数で8
  下位バイトは15を16進数に変換してF
  結果:8F
変換暗記ができているのであれば、方式1が圧倒的に早いです。
慣れていない場合、方式2は計算の手間がかかりますが、
16進数に変換すること自体は問題ないです。

2.16進数->2進数 変換
以下16進数0~Fまでの2進数対応を暗記しておきます。
0(0000),1(0001),2(0010),3(0011),
4(0100),5(0101),6(0110),7(0111),
8(1000),9(1001),A(1010),B(1011),
C(1100),D(1101),E(1110),F(1111)

例)16進数:8Fを2進数に変換
16進数1桁と2進数4桁は対応から相互変換可能です。
16進数:8F -> 2進数:1000 1111
2024.02.11 08:57
ちょーさん 
(No.5)
この投稿は投稿者により削除されました。(2024.02.11 09:44)
2024.02.11 09:44
ちょーさん 
(No.6)
この投稿は投稿者により削除されました。(2024.02.11 09:45)
2024.02.11 09:45
ちょーさん 
(No.7)
この投稿は投稿者により削除されました。(2024.02.11 09:49)
2024.02.11 09:49
ちょーさん 
(No.8)
連続の投稿、削除、再投稿で申し訳ございません。
IPv4のIPアドレスはオクテット(8ビット)ずつ「.」区切りの10進数で表記しています。

各オクテットの10進数の範囲は0~255で、2のべき乗の和になります。
2^7, 2^6, 2^5, 2^4 , 2^3, 2^2, 2^1, 2^0、つまり
128, 64, 32, 16, 8, 4, 2, 1 に「1または0」をかけた値の総和になります。

8桁の2進数への変換は、
2のべき乗の和にしてから、8桁2進数の各桁に「1」か「0」を付ける作業になります。

192=128+64=2^7+2^6=(bin)1100 0000
168=128+32+8=2^7+2^5+2^3=(bin)1010 1000
143=128+15=128+8+4+2+1=2^7+2^3+2^2+2^1+2^0=(bin)1000 1111
41=32+9=32+8+1=2^5+2^3+2^0=(bin)0010 1001

慣れてくると、連続「1」、連続「0」でよく見かける
255=(bin)1111 1111
 15=(bin)0000 1111
240=255-15=(bin)1111 0000
192=(bin)1100 0000
あたりは条件反射で変換できるようになります。
2024.02.11 09:49
ちょーさん 
(No.9)
dさんのご解説に便乗する形で恐れ入ります。
試験中、暗算で変換できないときは下記のようにやっています。

143を2進数に変換の例です。

(1)2の0乗~7乗を大きい順に並べた表を書く。

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1

(2)143を上記表内の要素の和に分解する。

143を超えない要素を大きい順に探し、余りを、より小さい要素の和に分解する。

143=[128]+15
15=[8]+7
7=[4]+3
3=[2]+[1]

143=[128]+[8]+[4]+[2]+[1]

(3)上記表の要素128、8、4、2、1の下に「1」、他の要素の下に「0」を書き、並べる。

1000 1111

4ビットごとに半角スペース区切ると2進数→16進数→10進数の検算がしやすいです。
1000 1111 → 8 F → 16×8+15=143

[別解]
pixさんのご解説に便乗する形で恐れ入ります。
16より大きい10進数の10進数 -> 2進数変換は、一旦16進数を経由すると計算が早いです。
2進数の0000~1111、16進数の0~F、10進数の0~15の対応は覚えておくと便利です。

符号なし2進数8桁の最大値255<(16^2)ですので、
10進数143→16の1乗と16の0乗の和に分解して16進数に変換→4ビットそれぞれを2進数に変換
143=8×16+15 → (16進数)8 F → (2進数)1000 1111
になります。
2024.02.11 11:45
otoさん  
(No.10)
皆さま
すごい!爆速ですね笑
石器時代から現代に進化した気分です。
ありがとうございました。
2024.02.12 07:41

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop