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

Print Friendly

Leave a Reply

Your email address will not be published. Required fields are marked *