Pertanyaan Perbedaan antara >>> dan >>


Apa perbedaan antara operator >>> dan >> di Jawa?


274
2018-05-11 14:02


asal


Jawaban:


>> adalah aritmatika bergeser ke kanan, >>> adalah pergeseran logis yang benar.

Dalam pergeseran aritmatika, bit tanda diperpanjang untuk mempertahankan angka yang masuk.

Misalnya: -2 diwakili dalam 8 bit 11111110 (karena bit paling signifikan memiliki bobot negatif). Menggeser ke kanan sedikit menggunakan pergeseran aritmatika akan memberi Anda 11111111, atau -1. Pergeseran kanan logis, bagaimanapun, tidak peduli bahwa nilai mungkin bisa mewakili nomor yang ditandatangani; itu hanya memindahkan semuanya ke kanan dan mengisi dari kiri dengan 0s. Menggeser -2 bit kanan kita dengan menggunakan pergeseran logis akan memberi 01111111.


304
2018-05-11 14:07



>>> adalah unsigned-shift; itu akan memasukkan 0. >> ditandatangani, dan akan memperpanjang tanda.

JLS 15.19 Shift Operator

Operator shift termasuk shift kiri <<, menandatangani shift kanan >>, dan pergeseran kanan unsigned >>>.

Nilai dari n>>s aku s n bergeser ke kanan s posisi bit dengan tanda-ekstensi.

Nilai dari n>>>s aku s n bergeser ke kanan s posisi bit dengan tanpa ekstensi.

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

Untuk membuat semuanya lebih jelas menambahkan rekan positif

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

Karena positif, baik peralihan bertanda tangan dan tidak bertanda akan menambah 0 hingga paling sedikit.

Pertanyaan-pertanyaan Terkait


71
2018-05-11 14:11



Mereka berdua benar, tetapi >>> aku s unsigned

Dari dokumentasi:

Operator shift kanan yang tidak ditandatangani ">>>" menggeser nol ke posisi paling kiri, sementara posisi paling kiri setelah ">>" bergantung pada ekstensi tanda.


40
2018-05-11 14:03



>>> akan selalu menempatkan 0 di paling kiri, sementara >> akan menempatkan 1 atau 0 tergantung pada apa tanda itu.


31
2018-05-11 14:04



Pergeseran kanan logis (v >>> n) mengembalikan nilai bit di dalamnya v telah dialihkan ke kanan oleh n posisi bit, dan 0 bergeser dari sisi kiri. Pertimbangkan untuk menggeser nilai 8-bit, yang ditulis dalam biner:

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

Jika kita menafsirkan bit sebagai bilangan bulat non-negatif unsigned, pergeseran kanan logis memiliki efek membagi nomor dengan kekuatan yang sesuai 2. Namun, jika nomor tersebut dalam representasi dua-komplemen, pergeseran kanan logis tidak benar membagi bilangan negatif . Sebagai contoh, shift kanan kedua di atas menggeser 128 ke 32 ketika bit diinterpretasikan sebagai angka yang tidak ditandatangani. Tapi itu bergeser -128 ke 32 ketika, seperti yang khas di Jawa, bit ditafsirkan dalam dua komplemen.

Oleh karena itu, jika Anda bergeser untuk membagi dengan kekuatan dua, Anda ingin pergeseran kanan aritmatika (v >> n). Ini mengembalikan nilai di mana bit-bit masuk v telah dialihkan ke kanan oleh n posisi bit, dan salinan bit paling kiri dari v digeser dari sisi kiri:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

Ketika bit adalah nomor dalam representasi dua-komplemen, aritmatika pergeseran kanan memiliki efek membagi dengan kekuatan dua. Ini berfungsi karena bit paling kiri adalah bit tanda. Membagi dengan kekuatan dua harus menjaga tanda yang sama.


29
2018-02-26 03:56



Baca lebih lanjut tentang Operator Bitwise dan Bit Shift

>>      Signed right shift
>>>     Unsigned right shift

Pola bit diberikan oleh operan kiri, dan jumlah posisi untuk digeser oleh operan kanan. Operator shift kanan yang tidak ditandatangani >>>  bergeser a nol ke posisi paling kiri,

sementara posisi paling kiri sesudahnya >> tergantung pada ekstensi tanda.

Dengan kata sederhana >>> selalu bergeser a nol ke posisi paling kiri sedangkan >> bergeser berdasarkan tanda nomor 1 untuk angka negatif dan 0 untuk bilangan positif.


Misalnya coba dengan angka negatif maupun positif.

int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));

System.out.println();

c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));

keluaran:

11111111111111111111111111011001
11111111111111111111111101100100
  111111111111111111111111011001
11111111111111111111111101100100

                          100110
                        10011000
                          100110
                        10011000

8
2017-07-30 16:08



Operator logika peralihan kanan (>>> N) menggeser bit ke kanan dengan posisi N, membuang bit tanda dan padding N paling kiri bit dengan 0's. Sebagai contoh:

-1 (in 32-bit): 11111111111111111111111111111111

setelah >>> 1 operasi menjadi:

2147483647: 01111111111111111111111111111111

Operator aritmatik peralihan kanan (>> N) juga menggeser bit ke kanan oleh posisi N, tetapi mempertahankan bit tanda dan bantalan N paling kiri bit dengan 1. Sebagai contoh:

-2 (in 32-bit): 11111111111111111111111111111110

setelah >> 1 operasi menjadi:

-1: 11111111111111111111111111111111

4
2018-01-27 09:19



catatan:

int a = 1 << 2;    // result a = 4
int b = 1 << 3;    // result b = 8

jadi kamu akan mendapatkan kekuatan 2 dengan cara ini


-2
2018-04-29 10:11