Rumah > Soal Jawab > teks badan
关于java中的移位,例如
int a=-8;
System.out.println(a>>>33);//2147483644
System.out.println(a>>>1); //2147483644
这里我采用了逻辑右移(无符号右移)为例,对-8进行逻辑右移,移动33位和移动1位的效果是一样的,其原因是移动33位时对其进行取模操作(与32相除的余数),对其余数进行移位,请问Java中这样设计的理由是什么?为什么不是当逻辑右移超过32位时,其结果应该为0,这样不是更符合常理吗?
巴扎黑2017-04-17 17:42:08
Saya melihat seseorang mempersoalkan jawapan saya, jadi saya menukarnya
Apa yang dikatakan oleh poster asal ialah mengapa anjakan 33 tidak ditetapkan kepada 0 secara langsung?
Sebab jika anda beroperasi dengan cara ini, pertama sekali, akan ada banyak nombor ajaib dalam kod mudah ~ Kerana jika saya beralih sebanyak 33, ia juga boleh menjadi 0, dan jika saya beralih sebanyak 34, ia boleh juga menjadi 0....
Dengan cara ini, Tidak ada standard lagi, dan operasi anjakan mesti dilakukan langkah demi langkah (simpan nilai, kemudian hitung, dan seterusnya tidak boleh diterima oleh komputer dan pereka bahasa! ! ! !
*Operasi anjakan hanyalah pendaraban asas dengan 2 dan bahagi dengan 2. Pertama sekali, saya ingin menyatakan sudut pandangan! Tiada nombor bukan sifar dibahagikan dengan 2^n akan mendapat 0. Orang yang tahu serba sedikit tentang matematik sepatutnya dapat mengetahui dengan mudah mengapa 1 >> 1 akan mendapat 0< The hasil 🎜>? ? ? Oleh kerana operasi bit hanya berfungsi pada integer, ini adalah konsep yang sama seperti secara langsung menggunakan 1/2 sebagai 0 dan bukannya 0.5.
大家讲道理2017-04-17 17:42:08
Operasi anjakan
sering digunakan untuk mengoptimumkan kaedah */
kerana kecekapannya yang tinggi Mengalihkan satu kedudukan ke kiri bersamaan dengan *2
dan mengalihkan satu kedudukan ke kanan adalah bersamaan dengan /2
. Sudah tentu, ini adalah dalam julat syarat tertentu.
Bagi >>>
anjakan 33-bit 不合理
, ia adalah pilihan untuk melakukan anjakan selepas operasi modulo, bukan? Perlu ada kegunaan lain, seperti melaksanakan beberapa algoritma khas (seperti MD5
algoritma penyulitan).
Mengenai apa yang dijelaskan di tingkat satu, saya tidak bersetuju dengannya. Anjakan, darab dan bahagi adalah bersamaan dan memerlukan syarat julat Sebagai seorang pengaturcara, anda harus memberi perhatian kepada perkara ini apabila menggunakannya. Secara peribadi, saya merasakan bahawa operasi anjakan Java sudah mempunyai beberapa ciri C. Ia adalah operasi peringkat bawah yang memerlukan pengaturcara mempunyai kemahiran asas tertentu untuk menggunakannya dengan baik.
PHP中文网2017-04-17 17:42:08
Anda beralih melepasi panjang maksimum jenis sekali untuk mendapatkan 0, mengapa tidak menetapkannya kepada 0 sahaja?