aşağıdaki iki kod farklı sonuç üretiyor:
System.out.println(0b11111100);
System.out.println((byte)0b11111100);
İlki sonucu 252 diye, ikincisi -4 diye veriyor.
İkinci çözdüğüm şey ise:
int a= 3;
int b= ~a;
b'nin değerini 0-15 arası bir değere ataması gerekiyordu kitapta, bunu şöyle yaptı:
int c = b & 0b1111;
Bunun da mantığını anladım. İkisi de java'nın girilen sayıları otomatik olarak integer kabul etmesinden kaynaklanıyor. İkincisinde 0-15'e indirgemek için öndeki 32 bit'i yok etmek gerekiyormuş (integer 36 bit yer kaplıyor, ama bize sadece sondaki 4 hane lazım), o yüzden 0b1111 diyince sadece sağdaki bitler kaldı, ve sayı 0-15 arasına indirgendi.
İlk örnekte ise ilk değerde 252 verdi çünkü integer 2 milyara kadar yolu var, eksili sayılara 2 milyardan sonra geçicek. Önce 2 milyara kadar normal sayım yapıcak yani.
Ama ikincisinde byte kullandığımız için byte -128, +127 aralığında tanımlı, o yüzden +127'ye kadar geldikten sonra eksili rakamlara dönmesi gerekti, ve şöyle saydı
124 125 126 127 -128 -127 -126 -125 diye 0'a doğru gelmeye başladı, 252. değer olarak -4'ü verdi.
Tam anlatamamış olabilirim ama adamlar çok ince düşünmüş yahu. Örneğin & ve operatörünü kullanırken 100 yazmamla 0100 yazmam arasında bile fark oluyor. Çünkü sayının başına 0 koyunca, 8 tabanında yazılmış kabul ediyor felan.
Öğrendikçe mutlu oluyorum ama hepsini unutmaya çok müsait şeyler, kitabı yazan bile hatırlamıyordur belki. Ama kesin bir mantığa oturan şeyler olduğu için uğraşmak güzel.
Yarın zor bir finalim var, oturdum buna kafa patlatıyorum.

Mutlu oldum ve paylaşmak istedim sadece.
