Java Puzzle 25 – Own Negation
Merhaba Arkadaslar
Su sart hangi durumda saglanabilir ?
i != 0 && i == -i
Oyle bir deger istiyoruz ki negatif’i kendisine esit olsun ve 0 olmasin. Matematiksel olarak bu mumkun mu ?
Double.NaN burada uygun olmayacaktir. Double.NaN kendisine de esit degildir. Bunu onceki bolumlerde islemistik.
Double.POSITIVE_INFINITY == – Double.POSITIVE_INFINITY de false olacaktir. Demek ki bu degerler isimizi gormeyecektir.
System.out.println(Double.NaN == Double.NaN); // false System.out.println(Double.NaN == -Double.NaN); // false System.out.println(Double.POSITIVE_INFINITY == -Double.POSITIVE_INFINITY); // false
Tamsayilar icin two’s complement arithmetic kullanilmaktadir.
Java Puzzle 20 – Two’s complement
Bir sayiyi negatif hale getirmek icin her biti degistirmek (1 leri 0 , 0 lari 1 yapmak) ve 1 eklemek gerekir.
Ornegin int 1 literali icin ; (int veri tipi 32 bittir)
http://www.binaryconvert.com/
00000000 00000000 00000000 00000001
-1 olmasi icin , bitleri degistirelim ve + 1 ekleyelim
Sonuc olarak -1 degeri su sekilde ifade edilir ;
Ilk bit 0 sa bu sayi pozitif , 1 se bu sayi negatif sayidir.
11111111 11111111 11111111 111111110 + 1 ------------------------------------ 11111111 11111111 11111111 111111111
Bir baska ornek olarak 2 degeri su sekilde ifade edilir ;
00000000 00000000 00000000 00000010
-2 degeri icin bitleri degistirelim ve +1 ekleyelim.
11111111 11111111 11111111 11111101 + 1 ----------------------------------- 11111111 11111111 11111111 11111110
Integer.MAX_VALUE “2147483647” (2^31 -1)
01111111 11111111 11111111 11111111
-2147483647 icin bitleri degistirelim +1 ekleyelim ;
10000000 00000000 00000000 00000000 + 1 ----------------------------------- 10000000 00000000 00000000 00000001
2147483647+1 degeri = Integer.MIN_VALUE degerine esittir , sayimiz negatife doner -2147483648
01111111 11111111 11111111 11111111 (2147483647) + 1 ----------------------------------- 10000000 00000000 00000000 00000000 (-2147483648) Integer.MIN_VALUE
Integer.MIN_VALUE degerinin negatifini alirsak ;
10000000 00000000 00000000 00000000 (-2147483648) Integer.MIN_VALUE
1 leri 0 , 0 lari 1 yapalim + 1 ekleyelim ;
01111111 11111111 11111111 11111111 + 1 ----------------------------------- 10000000 00000000 00000000 00000000 (-2147483648)
2147483647+2 degeri -2147483647 degerine esittir.
01111111 11111111 11111111 11111111 (2147483647) + 10 (2) ----------------------------------- 10000000 00000000 00000000 00000001 (-2147483647)
-2147483647 degerinin negatifini alalim ;
10000000 00000000 00000000 00000001 (-2147483647) bitleri degistirelim +1 ekleyelim ; 01111111 11111111 11111111 11111110 + 1 ----------------------------------- 01111111 11111111 11111111 11111111 (2147483647)
Dikkat edecek olursak sadece Integer.MIN_VALUE icin negatifini aldigimizda yine kendisine esit olmaktadir.
Bir sayinin negatifini almak overflow’a neden olabilir fakat Java bunu dikkate almaz.
Dolayisiyla i != 0 && i == -i sartini saglayacak i degeri ;
Long.MIN_VALUE Integer.MIN_VALUE olabilir.
Negation.java
package _25.own.negation; public class Negation { public static void main(String[] args) { System.out.println(Double.NaN == Double.NaN); // false System.out.println(Double.NaN == -Double.NaN); // false System.out.println(Double.POSITIVE_INFINITY == -Double.POSITIVE_INFINITY); // false int i = Integer.MIN_VALUE; // 10000000 00000000 00000000 00000000 --> (-2147483648) Integer.MIN_VALUE // negate Integer.MIN_VALUE // // 01111111 11111111 11111111 11111111 // + 1 // ----------------------------------- // 10000000 00000000 00000000 00000000 (-2147483648) // so Integer.MIN_VALUE == - Integer.MIN_VALUE; while (i != 0 && i == -i) { System.out.println("works or not ?"); } } }
Github kaynak kodlar / Source Code ;
leventerguder/injavawetrust-puzzler
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply