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.
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.
| A | B | A AND B | A OR B | A XOR B | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
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ç | İşlem | Maske kuralı | Örnek, X = 0x93 = 1001 0011 |
|---|---|---|---|
| Bitleri 0 yap (clear) | AND | temizlenecek bit 0, diğerleri 1 | X AND 0x0F = 0x03 |
| Bitleri 1 yap (set) | OR | set edilecek bit 1, diğerleri 0 | X OR 0x0F = 0x9F |
| Bitleri çevir (toggle) | XOR | çevrilecek bit 1, diğerleri 0 | X XOR 0x0F = 0x9C |
| Bit test et | AND | sadece o bit 1 | X 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 ‘nın maskesi : 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: .
Ondalıklı sayılar: IEEE 754
Tam sayı gösterimleri 3.75 ya da yazamaz. Bunun için bilimsel gösterimin ikilik hali kullanılır: . IEEE 754 single precision (C’deki float) 32 bitten oluşur:
| S | Exponent | Fraction |
|---|---|---|
| 1 bit | 8 bit | 23 bit |
| işaret (0 = +) | (bias) | virgülden sonraki bitler |
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:
| Exponent | Fraction | Anlamı |
|---|---|---|
| 0 | 0 | ±0 |
| 0 | ≠ 0 | denormal: |
| 255 | 0 | ±∞ |
| 255 | ≠ 0 | NaN |
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).
| Karakter | Hex | Ondalık |
|---|---|---|
| NUL (string sonu) | x00 | 0 |
| boşluk | x20 | 32 |
| ‘0’ … ‘9’ | x30 … x39 | 48 … 57 |
| ‘A’ … ‘Z’ | x41 … x5A | 65 … 90 |
| ‘a’ … ‘z’ | x61 … x7A | 97 … 122 |
| satır sonu (LF) | x0A | 10 |
Bilmen gereken iki özellik:
- Rakamın değeri = kod - x30. ‘7’ = x37 → 7. Tersi: 3 + x30 = x33 = ‘3’.
- 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 çevir | OR x20 |
| büyük harfe çevir | AND xDF |
| harf büyüklüğünü değiştir | XOR 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üşünce | Doğrusu |
|---|---|
| Bir biti silmek için OR | Silmek AND ile, maskede o bit 0 |
| XOR = OR | 1 XOR 1 = 0, 1 OR 1 = 1 |
| Fraction’a gizli 1’i yaz | 1.10101 → fraction 10101 |
| Exponent alanı = e | Alan = e + 127 |
| 0.1 tam yazılır | Sonsuz tekrar, yuvarlanır |
| Exponent 255 = çok büyük sayı | Özel değer: ∞ ya da NaN |
| ‘7’ karakterinin değeri 7 | x37 = 55; 7 için x30 çıkar |
| ‘A’ ile ‘a’ farkı x10 | x20 (bit 5) |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Compute 0x6C AND 0x3A, 0x6C OR 0x3A and 0x6C XOR 0x3A (8-bit). Give hex results.
Cevabı göster
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.
What is NOT 0x0F0F for a 16-bit value?
Cevabı göster
NOT her biti çevirir: hex'te her hane olur. 0→F, F→0: 0xF0F0.
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
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.
How can you test whether bit 4 of X = 0x5D is 1? What is the result?
Cevabı göster
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.
Encode 10.75 in IEEE 754 single precision. Give the final hex value.
Cevabı göster
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.
Encode -0.8125 in IEEE 754 single precision. Give the final hex value.
Cevabı göster
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.
What decimal number does the IEEE 754 single-precision value 0x42290000 represent?
Cevabı göster
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.
What decimal number does 0xC0A80000 represent in IEEE 754 single precision?
Cevabı göster
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.
Which value is represented by 0x7F800000 in IEEE 754 single precision?
Cevabı göster
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.
The ASCII code of 'q' is 0x71. Which bitwise operation and mask convert it to 'Q'? Give the result.
Cevabı göster
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'.
A program reads the character '7' from the keyboard (ASCII). Which value must be subtracted to get the integer 7?
Cevabı göster
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).
Is 0.1 exactly representable in IEEE 754 single precision? Explain briefly.
Cevabı göster
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).