关于java的逻辑移位和算数移位
PHPz
PHPz 2017-04-17 17:40:08
0
3
391

关于java中的移位,例如

int a=-8;
System.out.println(a>>>33);//2147483644
System.out.println(a>>>1); //2147483644

这里我采用了逻辑右移(无符号右移)为例,对-8进行逻辑右移,移动33位和移动1位的效果是一样的,其原因是移动33位时对其进行取模操作(与32相除的余数),对其余数进行移位,请问Java中这样设计的理由是什么?为什么不是当逻辑右移超过32位时,其结果应该为0,这样不是更符合常理吗?

PHPz
PHPz

学习是最好的投资!

全員に返信(3)
巴扎黑

私の回答に疑問を抱いている人がいたので、変更しました

元の投稿者が述べているのは、なぜシフト 33 が直接 0 に設定されないのかということです。
このように操作すると、まず、単純なコードにたくさんのマジックナンバーが含まれることになるからです ~ 33 ずらせば 0 にもなり、34 ずらせば 0 にもなるからですも0になる....
このように、もはや基準はなく、シフト操作は段階的に実行する必要があります(値を保存してから計算するなど)。この種の無制限の動きは必要です。コンピュータや言語の設計者には受け入れられません。 ! ! !

*シフト演算は単純に、基礎となる 2 の乗算と 2 による除算です。 まず最初に、観点を言いたいと思います。ゼロ以外の数値を 2^n で割ると 0 は得られません。数学を少し知っている人なら、1 >> 10の結果は? ? ?ビット演算は整数に対してのみ機能するため、これは 1/2 を 0.5 ではなく 0 として直接使用するのと同じ概念です。

いいねを押す +0
大家讲道理

シフト演算は、効率が高いため、*/ メソッドを最適化するためによく使用されます。もちろん、これは一定の条件の範囲内での話です。 *2 /2

33ビットのような

のシフトに関しては、モジュロ演算の後にシフトを実行することはオプションですよね?特別なアルゴリズム (>>> 暗号化アルゴリズムなど) を実行するなど、他の用途もあるはずです。 不合理一階の説明については、私は同意できません。 MD5シフト、乗算、除算は同等の
であり、プログラマはこれを使用する際に注意する必要があります。個人的には、Java のシフト操作はすでに C のいくつかの特徴を備えていると感じています。これは最下層の操作であり、それを使いこなすにはプログラマが特定の基本スキルを持っている必要があります。

いいねを押す +0
Ty80

0 を取得するために型の最大長を一度超えてシフトしました。なぜそれを 0 に設定しないのでしょうか?

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート