11010100 << 1 neden 10101000'e değil 110101000'e eşittir?


40

Neden 11010100 2 için bitleri değiştirmeye çalıştığımda sonuç 10101000 2 değil 110101000 2 olur .

int a = Integer.parseInt("11010100", 2) << 1;

Bunu yapmaya çalışıyorum:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

Ancak çıktı değeri 128'den büyükse, her şey eksi olur, ki bu mantıklıdır. Bu bit sayısının değişmemesini nasıl sağlayabilirim?


4
Tamsayı aritmetiği her zaman ints veya longs üzerinde yapılır .
Tom Hawtin - tackline

34
Tamsayılar kullanıyorsunuz, bunlar 32 bit uzunluğunda. Sonucun neden 8 bite kesilmesini beklersiniz?
jhamon

1
bayt a = ... düzeltir.
Perdi Estaquel

Yanıtlar:


61

Bir seferde bir adım atalım.

  1. Integer.parseInt("11010100", 2)- bu int değeri 212'dir. Bu arada, gereksizdir; Sadece yazabilirsiniz: 0b11010100.

  2. 0b11010100 << 1, 0b110101000424 ile aynıdır .

  3. Daha sonra bir bayt için döküm: (byte)(0b11010100 << 1). İlk 8'in ötesindeki bitler durur, bu da -88 olan 0b10101000 bırakır. Eksi, evet, çünkü java baytları imzalanır.

  4. Daha sonra bir int değerine atarken sessizce bu -88'i int'e geri çevirirsiniz. -88 olarak kalır, yani tüm üst bitler 1'dir.

Dolayısıyla, nihai değer -88.

168Bunun yerine (tam olarak aynı bitlerdir, ancak imzalı yerine imzasız olarak gösterilir) görmek istiyorsanız & 0xFF, ilk numarayı 0'dan 8'e kadar olan tüm bitleri ayarlayarak pozitif bir sayıyı garanti eden olağan hile kullanmaktır :

byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.

// or in one go:

System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168

19
O değeri saklıyor, int aeğer öyleyse & 0xFF, o zaman hiç döküm yapmana gerek yok. int a = (0b11010100<< 1) & 0xFF;
Mooing Duck

9

En alt 8 bitten daha yüksek tüm bitleri 0 olarak ayarlamak istiyorsanız, bit olarak AND kullanabilirsiniz:

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

Çıktı:

10101000

6

Bunun gibi bir şey deneyin:

int anInt = Integer.parseInt("11010100", 2) << 1;
int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);

toUnsignedInt , Java SE 8 ile tanıtıldı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.