SEN2201 · 2. hafta · Bits, Data Types, and Operations

Bit işlemleri, IEEE 754 kayan nokta ve ASCII

AND/OR/XOR/NOT ile bit maskeleri, IEEE 754 single precision encode-decode tarifi ve ASCII karakter kodları. Vizede her biri garanti bir soru.

bitwise ANDbitwise ORXORNOTbit maskIEEE 754single precisionsign bitexponentbiasfractionnormalizeddenormalizedASCII

Geçen sayfada bitleri tam sayı olarak okudun. Bu sayfada üç yeni şey var: bitler üzerinde mantık işlemleri (maske), ondalıklı sayılar için IEEE 754 ve karakterler için ASCII. Üçü de tarifle çözülür. Tarifi bilen tam puan alır.

Mantık işlemleri (bitwise operations)

Bu işlemler iki sayının aynı konumdaki bitleri üzerinde ayrı ayrı yapılır. Carry yoktur, bitler birbirini etkilemez.

ABA AND BA OR BA XOR BNOT A
000001
010111
100110
111100
       1100 1001   (0xC9)
AND    1111 0000   (0xF0)
       ---------
       1100 0000   (0xC0)     alt 4 bit silindi

Bit maskesi (bit mask)

Bir sayının bazı bitlerini değiştirmek ya da okumak için seçilen ikinci sayıya maske denir. Hangi işlemi seçeceğin, ne yapmak istediğine bağlı:

AmaçİşlemMaske kuralıÖrnek, X = 0x93 = 1001 0011
Bitleri 0 yap (clear)ANDtemizlenecek bit 0, diğerleri 1X AND 0x0F = 0x03
Bitleri 1 yap (set)ORset edilecek bit 1, diğerleri 0X OR 0x0F = 0x9F
Bitleri çevir (toggle)XORçevrilecek bit 1, diğerleri 0X XOR 0x0F = 0x9C
Bit test etANDsadece o bit 1X AND 0x08 = 0 → bit 3 = 0

Akılda tutma yolu: AND ile 0 öldürür, OR ile 1 yaratır, XOR ile 1 çevirir. AND’de maskenin 1 olduğu yerler, OR ve XOR’da 0 olduğu yerler sayıya dokunmaz.

İPUCU · Bit numaraları. Bitler sağdan, 0’dan numaralanır. Bit kk‘nın maskesi 2k2^k: bit 0 = 0x01, bit 3 = 0x08, bit 4 = 0x10, bit 5 = 0x20, bit 7 = 0x80.

LC-3’te sadece AND ve NOT vardır (7. hafta). OR’u DeMorgan ile kurarsın: A OR B=NOT(NOT A AND NOT B)A \text{ OR } B = \text{NOT}(\text{NOT }A \text{ AND NOT }B).

Ondalıklı sayılar: IEEE 754

Tam sayı gösterimleri 3.75 ya da 6×10236 \times 10^{23} yazamaz. Bunun için bilimsel gösterimin ikilik hali kullanılır: ±1.xxx×2e\pm 1.xxx \times 2^{e}. IEEE 754 single precision (C’deki float) 32 bitten oluşur:

SExponentFraction
1 bit8 bit23 bit
işaret (0 = +)e+127e + 127 (bias)virgülden sonraki bitler

N=(−1)S×1.fraction×2 exponent−127(1≤exponent≤254)N = (-1)^S \times 1.\text{fraction} \times 2^{\,\text{exponent} - 127} \qquad (1 \le \text{exponent} \le 254)

Baştaki 1 her normalize sayıda olduğu için yazılmaz (hidden bit). Bu sayede 24 bitlik hassasiyet 23 bite sığar. Exponent, negatif üsler de yazılabilsin diye 127 kaydırılmış (biased) saklanır.

Özel durumlar:

ExponentFractionAnlamı
00±0
0≠ 0denormal: 0.fraction×2−1260.\text{fraction} \times 2^{-126}
2550±∞
255≠ 0NaN

Kesir kısmını ikiliğe çevirme

Kesri 2 ile çarp, tam kısmı (0 ya da 1) yaz, kesirli kısımla devam et. Kesir 0 olunca dur. Yazdığın bitler yukarıdan aşağı okunur.

0.375 × 2 = 0.75   → 0
0.75  × 2 = 1.5    → 1
0.5   × 2 = 1.0    → 1   (dur)
0.375 = 0.011

Encode tarifi (sayı → bitler)

Çözümlü örnek: 6.125

1) işaret: pozitif → S = 0
2) 6 = 110
3) 0.125: ×2=0.25→0, ×2=0.5→0, ×2=1.0→1  → .001
   6.125 = 110.001
4) normalize: 110.001 = 1.10001 × 2^2   (virgül 2 sola)
5) exponent = 2 + 127 = 129 = 1000 0001
6) fraction = 10001 ve 18 sıfır
7) 0 10000001 10001000000000000000000
   0100 0000 1100 0100 0000 0000 0000 0000 = 0x40C40000

Çözümlü örnek: -2.5

2.5 = 10.1 = 1.01 × 2^1
S = 1, exponent = 128 = 1000 0000, fraction = 01000...
1 10000000 01000000000000000000000 = 1100 0000 0010 0000 ... = 0xC0200000

Decode tarifi (bitler → sayı)

Çözümlü örnek: 0x41F40000

1) 0100 0001 1111 0100 0000 0000 0000 0000
2) S = 0 | exponent = 1000 0011 | fraction = 1110100...
3) exponent = 131 → e = 131 - 127 = 4
4) significand = 1.11101
5) 1.11101 × 2^4 = 11110.1   (virgül 4 sağa)
6) 11110 = 30, .1 = 0.5 → 30.5

Çözümlü örnek: 0xC1100000

1100 0001 0001 0000 ... → S = 1 | exponent = 1000 0010 = 130 → e = 3 | fraction = 001...
1.001 × 2^3 = 1001 = 9 → -9

TUZAK · alan sınırları hex haneleriyle çakışmaz. 0x41’in ilk biti S, sonraki 7 bit exponent’in başı; exponent’in son biti bir sonraki hex hanenin ilk bitidir. Önce 32 biti tek satıra yaz, sonra 1 | 8 | 23 diye çiz.

TUZAK · IEEE’de puan kaybettiren dört hata. (1) 127’yi eklemeyi ya da çıkarmayı unutmak. (2) Gizli 1’i fraction’a yazmak. (3) Fraction’ı sağdan doldurmak: bitler virgülün hemen sağından başlar, kalan sağa 0 eklenir. (4) Hex’e çevirirken S’yi ayrı tutup 4’lü gruplamayı bozmak.

Her ondalık sayı tam yazılamaz

0.1’in ikilik açılımı sonsuza kadar tekrarlar (0.0001100110011…). 23 bite sığmadığı için yuvarlanır. C’de 0.1f + 0.2f == 0.3f gibi karşılaştırmalar bu yüzden tehlikelidir. Paydası 2’nin kuvveti olan kesirler (1/2, 3/8, 5/16) tam yazılır.

ASCII: karakterler

Klavyeden gelen ya da ekrana giden her karakter bir sayıdır. ASCII (American Standard Code for Information Interchange) her karakteri 8 bitlik bir koda eşler (aslında 7 bit yeterli, en üst bit 0).

KarakterHexOndalık
NUL (string sonu)x000
boşlukx2032
‘0’ … ‘9’x30 … x3948 … 57
‘A’ … ‘Z’x41 … x5A65 … 90
‘a’ … ‘z’x61 … x7A97 … 122
satır sonu (LF)x0A10

Bilmen gereken iki özellik:

  1. Rakamın değeri = kod - x30. ‘7’ = x37 → 7. Tersi: 3 + x30 = x33 = ‘3’.
  2. Büyük ve küçük harf sadece bit 5’te farklıdır (x20 = 32). ‘M’ = x4D = 0100 1101, ‘m’ = x6D = 0110 1101.
Dönüşümİşlem
küçük harfe çevirOR x20
büyük harfe çevirAND xDF
harf büyüklüğünü değiştirXOR x20

“CAT” kelimesi bellekte x43 x41 x54 olarak durur. LC-3’te .STRINGZ ile yazılan bir string her karakteri bir kelimeye (16 bit) koyar ve sonuna x0000 ekler (10. hafta).

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Bir biti silmek için ORSilmek AND ile, maskede o bit 0
XOR = OR1 XOR 1 = 0, 1 OR 1 = 1
Fraction’a gizli 1’i yaz1.10101 → fraction 10101
Exponent alanı = eAlan = e + 127
0.1 tam yazılırSonsuz tekrar, yuvarlanır
Exponent 255 = çok büyük sayıÖzel değer: ∞ ya da NaN
‘7’ karakterinin değeri 7x37 = 55; 7 için x30 çıkar
‘A’ ile ‘a’ farkı x10x20 (bit 5)

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

Compute 0x6C AND 0x3A, 0x6C OR 0x3A and 0x6C XOR 0x3A (8-bit). Give hex results.

Cevabı göster
0x28, 0x7E, 0x56

0x6C = 0110 1100, 0x3A = 0011 1010.
AND (ikisi de 1): 0010 1000 = 0x28. OR (en az biri 1): 0111 1110 = 0x7E. XOR (farklıysa 1): 0101 0110 = 0x56.

Soru 2kolay

What is NOT 0x0F0F for a 16-bit value?

Cevabı göster
0xF0F0

NOT her biti çevirir: hex'te her hane F−hF - h olur. 0→F, F→0: 0xF0F0.

Soru 3orta

Let S = 0xB6. Give the operation and mask to (a) set bit 6, (b) clear bit 2, (c) toggle the low 4 bits. Give each result in hex.

Cevabı göster
OR 0x40 → 0xF6; AND 0xFB → 0xB2; XOR 0x0F → 0xB9

S = 1011 0110.
(a) Set = OR, maskede sadece bit 6 = 1: 0100 0000. Sonuç 1111 0110 = 0xF6.
(b) Clear = AND, maskede sadece bit 2 = 0: 1111 1011 = 0xFB. Sonuç 1011 0010 = 0xB2.
(c) Toggle = XOR, alt 4 bit 1: 0000 1111. Sonuç 1011 1001 = 0xB9.

Soru 4kolay

How can you test whether bit 4 of X = 0x5D is 1? What is the result?

Cevabı göster
X AND 0x10 = 0x10, so bit 4 is 1

Test için AND ile sadece o biti 1 olan maske kullan. 0101 1101 AND 0001 0000 = 0001 0000. Sonuç sıfır değil, yani bit 4 = 1.

Soru 5orta

Encode 10.75 in IEEE 754 single precision. Give the final hex value.

Cevabı göster
0x412C0000

10 = 1010, 0.75 = .11 → 1010.11 = 1.01011 × 2^3.
S = 0. Exponent = 3 + 127 = 130 = 1000 0010. Fraction = 01011 ve 18 sıfır.
0 10000010 01011000000000000000000 → 0100 0001 0010 1100 0000 ... = 0x412C0000.

Soru 6orta

Encode -0.8125 in IEEE 754 single precision. Give the final hex value.

Cevabı göster
0xBF500000

0.8125 × 2 = 1.625 → 1; 0.625 × 2 = 1.25 → 1; 0.25 × 2 = 0.5 → 0; 0.5 × 2 = 1.0 → 1. Yani 0.1101.
Normalize: 1.101 × 2^-1. S = 1, exponent = -1 + 127 = 126 = 0111 1110, fraction = 101 ve sıfırlar.
1 01111110 10100... → 1011 1111 0101 0000 ... = 0xBF500000.

Soru 7orta

What decimal number does the IEEE 754 single-precision value 0x42290000 represent?

Cevabı göster
42.25

0100 0010 0010 1001 0000 ... → S = 0 | exponent = 1000 0100 = 132 | fraction = 0101001...
E = 132 - 127 = 5. 1.0101001 × 2^5 = 101010.01 = 32 + 8 + 2 + 0.25 = 42.25.

Soru 8orta

What decimal number does 0xC0A80000 represent in IEEE 754 single precision?

Cevabı göster
-5.25

1100 0000 1010 1000 ... → S = 1 | exponent = 1000 0001 = 129 → E = 2 | fraction = 0101...
1.0101 × 2^2 = 101.01 = 5.25. S = 1 → -5.25.

Soru 9zor

Which value is represented by 0x7F800000 in IEEE 754 single precision?

Cevabı göster
+infinity

0 11111111 000...0: exponent alanı 255 (hepsi 1) ve fraction 0 → sonsuz. S = 0 olduğu için pozitif sonsuz. Fraction 0'dan farklı olsaydı NaN (not a number) olurdu.

Soru 10orta

The ASCII code of 'q' is 0x71. Which bitwise operation and mask convert it to 'Q'? Give the result.

Cevabı göster
AND 0xDF → 0x51

Büyük ve küçük harf sadece bit 5'te (0x20) farklıdır. 'Q' için bit 5'i temizle: AND, maskede bit 5 = 0: 1101 1111 = 0xDF. 0111 0001 AND 1101 1111 = 0101 0001 = 0x51 = 'Q'.

Soru 11kolay

A program reads the character '7' from the keyboard (ASCII). Which value must be subtracted to get the integer 7?

Cevabı göster
0x30 (48)

Rakamlar ASCII'de art arda: '0' = 0x30, '1' = 0x31, …, '9' = 0x39. '7' = 0x37, 0x37 - 0x30 = 7. LC-3 programlarında klavyeden gelen rakamı sayıya çevirmek için hep bu yapılır (7-8. ve 10. hafta).

Soru 12zor

Is 0.1 exactly representable in IEEE 754 single precision? Explain briefly.

Cevabı göster
No

0.1'in ikilik açılımı sonsuz tekrarlar: 0.000110011001100… 23 bitlik fraction'a sığmaz, yuvarlanır. Gerçekte saklanan değer 0.10000000149011612'dir (0x3DCCCCCD). Paydası 2'nin kuvveti olan kesirler (0.5, 0.25, 0.375) ise tam yazılır.

Doğrulama: Bit işlemleri node ile hesaplandı; IEEE 754 kodlamaları DataView.setFloat32/getFloat32 ile bit düzeyinde doğrulandı; ASCII kodları charCodeAt ile kontrol edildi (verify/SEN2201/02.mjs).

Deftere not kartı

AND = temizle/test (maskede 0 olan silinir) | OR = set | XOR = çevir | NOT = hepsini çevir bit k maskesi = 2^k: bit4 = 0x10, bit5 = 0x20, bit7 = 0x80 clear bit k: AND ~(2^k) (bit2 -> AND 0xFB) IEEE 754 single: S(1) | E(8, bias 127) | F(23) N = (-1)^S × 1.F × 2^(E-127), 1 ≤ E ≤ 254 E = 0 -> denormal 0.F × 2^-126 (ve ±0) | E = 255 -> F=0 ise ±∞, değilse NaN ENCODE: tam kısım böl, kesir ×2 -> 1.xxx × 2^e -> E = e+127 -> F = xxx, sağa 0 DECODE: 32 bite aç -> 1|8|23 böl -> e = E-127 -> 1.F'yi e kadar kaydır gizli 1 YAZILMAZ. 1.0 = 0x3F800000, -1.0 = 0xBF800000 ASCII: '0'=x30..'9'=x39 | 'A'=x41 | 'a'=x61 | boşluk=x20 | NUL=x00 rakam -> sayı: - x30 | küçük harf: OR x20 | büyük: AND xDF | çevir: XOR x20