Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ビットについて|入門者向け資料
Search
mina
May 24, 2021
0
140
ビットについて|入門者向け資料
大学サークルのイントロ用資料です
そもそもビットってなんぞやを扱います
mina
May 24, 2021
Tweet
Share
More Decks by mina
See All by mina
おうちGitLabのススメ
silmin_
3
960
Git入門
silmin_
23
13k
暗号について
silmin_
0
110
LinuxCommand入門
silmin_
0
270
LinuxCommand入門2
silmin_
0
190
Webについて
silmin_
3
130
ネットワークとは
silmin_
0
170
コンピュータとは|初心者向け資料
silmin_
1
97
GitLab-CIとGoogleCloudRunで作るSandBox環境
silmin_
2
220
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
The Pragmatic Product Professional
lauravandoore
32
6.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
Speed Design
sergeychernyshev
25
670
Unsuck your backbone
ammeep
669
57k
Designing for humans not robots
tammielis
250
25k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Writing Fast Ruby
sferik
628
61k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Designing for Performance
lara
604
68k
Transcript
ビットについて SecPrj Intro-phase
ビットとは ビットとは、情報量の最小単位で、二つの選択肢から一つを特定する情報の 量。語源は “binary digit” (二進法の数字)と言われ、コンピュータなどでは0と1 のいずれかを取る二進数の一桁として表される。情報をすべてビット列に置き 換えて扱うことを「デジタル」(digial)という。 (ビットとは -
IT用語辞典 e-Words より) 『0 / 1で表現される,情報量の最小単位』
10110010
10110010 (2) 178 (10)
普段は10進数を使っている 使える数字は0~9の10種類 9の次は繰り上がりで,10になる ちなみに時間は24進数 分/秒は60進数 1 7 8 = 100
* 1 + 10 * 7 + 1 * 8
2進数を考える 使える数字は0,1の2種類 1の次は繰り上がりで,10(2)になる 1 0 1 1 0 0 1
0(2) = 128*1 + 64*0 + 32*1 + 16*1 + 8*0 + 4*0 + 2*1 + 1*0 = 128*1 + 32*1 + 16*1 + 2*1
1 0 1 1 0 0 1 0 (2) 2^n(重み)
7 6 5 4 3 2 1 0 2進数 1 0 1 1 0 0 1 0 値 128 64 32 16 8 4 2 1 それぞれの桁には重みがあり,2^(重み)で計算される n桁目の重みは(n-1)
1 0 1 1 0 0 1 0 (2) 2^n(重み)
7 6 5 4 3 2 1 0 2進数 1 0 1 1 0 0 1 0 値 128 64 32 16 8 4 2 1 = 128 + 32 + 16 + 2 = 178
コンピュータ内でどう扱うか コンピュータは電気によって動いている 0 / 1を電気のある / ないに置き換える 具体的には,電圧が閾値以上かどうか 0 [V]
5 [V] [ V ] [ t ]
コンピュータ内でどう扱うか コンピュータは電気によって動いている 0 / 1を電気のある / ないに置き換える 具体的には,電圧が閾値以上かどうか 0 [V]
5 [V] 0 (Low) 1 (High) [ V ] [ t ]
電気信号からビット列への変換(A/D変換) 0 [V] 5 [V] [ V ] [ t
]
電気信号からビット列への変換(A/D変換) 0 [V] 5 [V] [ V ] [ t
] 0 1 0 0 0 0 1 1
電気信号からビット列への変換(A/D変換) 01010001(2) 81(2) バイトオーダー (どっちから解釈するか) は予め決めておく (Big Endian / Little
Endian) 0 [V] 5 [V] [ V ] [ t ] 0 1 0 0 0 0 1 1
アナログとデジタル(余談) アナログは連続的な表現,デジタルは離散的な表現 デジタル(ある一点を切り出してる) アナログ(途切れなく続いてる)
論理演算 論理演算とは、真(true)と偽(false)の二通りの状態を取る真偽値(真理値/ ブール値)の間で行われる演算。コンピュータでは真を1に、偽を0に対応付け たビット演算として行われることが多い。 (論理演算 - IT用語辞典 e-Words より)
こういうやつ 株式会社K-fix http://www.k-fix.jp/skill/it/01/page08.html
ビットで考える A B Y 0 0 0 0 1 1
1 0 1 1 1 1 Y = A OR B A B Y 0 0 0 0 1 0 1 0 0 1 1 1 Y = A AND B A B Y 0 0 0 0 1 1 1 0 1 1 1 0 Y = A XOR B A Y 0 1 1 0 Y = NOT A 排他的論理和(Exclusive OR)は, XOR / EOR / ExOR などの表記がある
否定もある(出力にNOTかませる) A B Y 0 0 1 0 1 0
1 0 0 1 1 0 Y = A NOR B A B Y 0 0 1 0 1 1 1 0 1 1 1 0 Y = A NAND B A B Y 0 0 1 0 1 0 1 0 0 1 1 1 Y = A XNOR B
論理素子(論理ゲート) A B Y 0 0 0 0 1 1
1 0 1 1 1 1 Y = A OR B A B Y 0 0 0 0 1 0 1 0 0 1 1 1 Y = A AND B A B Y 0 0 0 0 1 1 1 0 1 1 1 0 Y = A XOR B A Y 0 1 1 0 Y = NOT A
論理素子(論理ゲート) A B Y 0 0 1 0 1 0
1 0 0 1 1 0 Y = A NOR B A B Y 0 0 1 0 1 1 1 0 1 1 1 0 Y = A NAND B A B Y 0 0 1 0 1 0 1 0 0 1 1 1 Y = A XNOR B
NAND素子は何にでもなれる(余談) NOT AND OR 図:NAND - MONOist https://monoist.atmarkit.co.jp/mn/articles/0803/26/news136.html 色んな素子作るより全部NAND素子で賄えた方が安上り (USBメモリとかSDカードとか,NANDフラッシュメモリが使われてる)
2進数での論理演算(ビット演算) 10011010 (2) 00101001 (2) OR AND XOR :
ビット演算 - OR A 1 0 0 1 1 0
1 0 B 0 0 1 0 1 0 0 1 Y 1 0 1 1 1 0 1 1 10011010(2) OR 00101001(2) 同じ重み同士で演算 算数の筆算みたいな感じ 桁数が違ったら足りない部分を 0で埋める A B Y 0 0 0 0 1 1 1 0 1 1 1 1
ビット演算 - OR A 1 0 0 1 1 0
1 0 B 0 0 1 0 1 0 0 1 Y 1 0 1 1 1 0 1 1 10011010(2) OR 00101001(2) Y = 10111011(2) A B Y 0 0 0 0 1 1 1 0 1 1 1 1
ビット演算 - AND A 1 0 0 1 1 0
1 0 B 0 0 1 0 1 0 0 1 Y 0 0 0 0 1 0 0 0 10011010(2) AND 00101001(2) Y = 00001000(2) A B Y 0 0 0 0 1 0 1 0 0 1 1 1
ビット演算 - XOR A 1 0 0 1 1 0
1 0 B 0 0 1 0 1 0 0 1 Y 1 0 1 1 0 0 1 1 10011010(2) XOR 00101001(2) Y = 10110011(2) A B Y 0 0 0 0 1 1 1 0 1 1 1 0
ビット演算 - NOT A 1 0 0 1 1 0
1 0 Y 0 1 1 0 0 1 0 1 NOT 10011010(2) Y = 01100101(2) A Y 0 1 1 0
ビット演算 - NOT - XORで実現 A 1 0 0 1
1 0 1 0 B 1 1 1 1 1 1 1 1 Y 0 1 1 0 0 1 0 1 NOT 10011010(2) = 10011010(2) XOR 11111111(2) Y = 01100101(2) A B Y 0 0 0 0 1 1 1 0 1 1 1 0
ビット演算 - シフト A 1 0 0 1 1 0
1 0 Y 0 1 0 0 1 1 0 1 右シフト 10011010(2) Y = 01001101(2) 論理シフトや算術シフトの違い ローテートの概念は割愛 右シフトは ÷ 2
ビット演算 - 任意のbitを取り出す A 1 0 0 1 1 0
1 0 B 0 0 0 0 1 1 1 1 Y 0 0 0 0 1 0 1 0 10011010(2) AND 00001111(2) Y = 00001010(2) 下位4bitのみ取り出す A B Y 0 0 0 0 1 0 1 0 0 1 1 1
フリップフロップ(FF : Flip-Flop) フリップフロップ回路とは、最も基本的な構造の論理回路の一つで、二つの状態(通常「0」お よび「1」に対応付けられる)のいずれかを保持することができるもの。現在の入力と共に過去 の入力も利用する順序回路の一種で、SRAMやマイクロプロセッサ(CPU/MPU)内部のレジ スタ、キャッシュメモリなどに応用されている。 (フリップフロップ回路 - IT用語辞典
e-Words より) JK-FF
2進数での足し算(+) 10011010 (2) + 00101001 (2)
2進数での足し算(+) 10011010 (2) + 00101001 (2) A 1 0 0
1 1 0 1 0 B 0 0 1 0 1 0 0 1 Y 1 1 0 0 0 0 1 1
2進数での足し算(+) 10011010 (2) + 00101001 (2) A 1 0 0
1 1 0 1 0 B 0 0 1 0 1 0 0 1 Y 1 1 0 0 0 0 1 1 1 + 1 = 10 1
2進数での足し算(+) 10011010 (2) + 00101001 (2) A 1 0 0
1 1 0 1 0 B 0 0 1 0 1 0 0 1 Y 1 1 0 0 0 0 1 1 1 + 1 = 10 1 1
2進数での足し算(+) 10011010 (2) + 00101001 (2) A 1 0 0
1 1 0 1 0 B 0 0 1 0 1 0 0 1 Y 1 1 0 0 0 0 1 1 1 + 1 = 10 1 1 1
加算機 半加算器は2つの入力ビットを足し算して桁上がり(C)と解(S)を出すもの(2in-2out) 全加算器は2つの入力ビットと前段の桁上がりを考慮した加算機(3in-2out) 図:【問題9】 ゲート回路の簡単化:完全マスター! 電子回路ドリル II(9) - MONOist https://monoist.atmarkit.co.jp/mn/articles/0803/13/news126.html
半加算器(Half-Adder) 全加算器(Full-Adder)
まとめ 電気信号と2進数の関係について学んだ ビット演算はコンピュータの中でうまくビット列を扱うために使われる コンピュータの実体はクソデカ論理回路
8進数と16進数(余談) 2進数や10進数以外にも,いくつかよく使われる進数表現がある • 8進数 ◦ 0~7が使える ◦ n桁目の重みは8^(n-1) ◦ 000
000 000 … のように,2進数を3桁ごとに区切ると変換しやすい (2進3桁は0~7を表現可能) ◦ 011 のように表記する(これは 8進数で11の意味)(OctalのO→0) • 16進数 ◦ 0~9,A~Fが使える(A:11, B:12, C:13, D:14, F:15) ◦ n桁目の重みは16^(n-1) ◦ 0000 0000 0000 … のように,2進数を4桁ごとに区切ると変換しやすい (2進4桁は0~15を表現可能) ◦ 0x1Fのように表記する(これは 16進数で1Fの意味)(Hexadecimalのx) ◦ 人間が結構読めるのでバイナリ形式とかはこれで表現したのをよく見る
8進数と16進数(余談)-「コンピュータとは」より 00000000: cffa edfe 0700 0001 0300 0000 0200 0000
................ 00000010: 1100 0000 d805 0000 8580 2100 0000 0000 ..........!..... 00000020: 1900 0000 4800 0000 5f5f 5041 4745 5a45 ....H...__PAGEZE 00000030: 524f 0000 0000 0000 0000 0000 0000 0000 RO.............. 00000040: 0000 0000 0100 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 0000 0000 1900 0000 2802 0000 ............(... 00000070: 5f5f 5445 5854 0000 0000 0000 0000 0000 __TEXT.......... 00000080: 0000 0000 0100 0000 0080 0000 0000 0000 ................ 00000090: 0000 0000 0000 0000 0080 0000 0000 0000 ................ .exeファイル(実行ファイル)の実体 この部分が16進数
ビット(bit)とバイト(Byte)(余談) 1 B(Byte) = 8 bit 1 KB = 10^3
B = 1000 B 1 MB = 10^6 KB = 1000000 B 1 GB = 1000 MB = 10^9 B = 10000000000 B 1 TB = 1000 GB = 10^12 B = 1000000000000 B 1 PB = 1000 TB = 10^15 B = 1000000000000000 B 1 EB = 1000 PB = 10^18 B = 1000000000000000000 B 1 ZB = 1000 EB = 10^21 B = 1000000000000000000000 B 1 YB = 1000 ZB = 10^24 B = 1000000000000000000000000 B キロ メガ ギガ テラ ペタ エクサ ゼタ ヨタ
KB(キロバイト)とKiB(キビバイト)(余談) 10進ベースだと 1 KB = 10^3 B = 1000 B
2進ベースだと 1 KiB = 2^10 B = 1024 B コンピュータは2進ベースで動いている 1 MiB = 1024 KB = 2^20 B 1 GiB = 1024 MB = 2^30 B 1 TiB = 1024 GB = 2^40 B メビバイト ギビバイト ティビバイト