アカウント名:
パスワード:
Javaに限らず、C/C++でも大抵はそうなります。算術シフトと論理シフト、記号はどっちも>>。ただのこの区別って仕様化されてたか、未定義だけど大抵そう実装されてるって話だったかは忘れた。
Javaには符号無し整数型が存在しないので、 >> が算術右シフト、>>> が論理右シフトであると定められています(JLSに書かれた仕様)。C/C++に右シフトの演算子は >> の一種類しかありませんが、符号無し整数なら論理右シフトになることが保証されています(仕様)。負の符号付き整数を右シフトしたとき何が起きるかは処理系定義なので(仕様)算術右シフトになるかもしれませんし論理右シフトになるかもしれませんが、どちらなのかは処理系のマニュアルのどこかで文書化されているはずです(たとえばVC++の場合 [microsoft.com])。そもそも負数の内部表現が2の補数であるとは限りませんし。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家
ハードウェアでは昔からよく有る事 (スコア:2, おもしろおかしい)
それが表に出てくる事はほとんどありませんが、1994年のPentium FDIV命令の話は有名ですよね。
Re:ハードウェアでは昔からよく有る事 (スコア:2, 参考になる)
もろもろの事情で浮動小数点演算ができない時には、固定小数点演算で計算する事があります。
固定小数点演算は早いのですが「合計を求める」など多数の数字を足し合わせる処理は苦手です。(オーバーフローの恐れがある)
それでも合計を求めたい場合は最下位ビットを切り捨てながら計算する場合があります。
int step;
for (int i = 1;i < nums.length; i *= 2 ){ //加算をツリー状に行う
step = i<<1;
for (int j = 0; j < nums.length; j += step)
nums[j]=(nums[j]+nums[j+i])>>1; //加算して最下位ビットを切り捨て
}
ここでnumsは整数型、配列サイズは2のべき乗、符号付の場合は言語によって検討が必要です。
頭から加算するんではなくツリー状に加算を行うのがポイント。
合計がプラスかマイナスかなど精度の必要ない時に使います。
配列サイズなど検討する必要がありますが、ベースバンド処理とかでたまに見かけます。
JAVA初めて使ったんですが負の数の右シフトは負の数になるんですね。ちょっと意外でした。
Re: (スコア:0)
Javaに限らず、C/C++でも大抵はそうなります。
算術シフトと論理シフト、記号はどっちも>>。
ただのこの区別って仕様化されてたか、未定義だけど大抵そう実装されてるって話だったかは忘れた。
Re: (スコア:0)
Javaには符号無し整数型が存在しないので、 >> が算術右シフト、>>> が論理右シフトであると定められています(JLSに書かれた仕様)。
C/C++に右シフトの演算子は >> の一種類しかありませんが、符号無し整数なら論理右シフトになることが保証されています(仕様)。負の符号付き整数を右シフトしたとき何が起きるかは処理系定義なので(仕様)算術右シフトになるかもしれませんし論理右シフトになるかもしれませんが、どちらなのかは処理系のマニュアルのどこかで文書化されているはずです(たとえばVC++の場合 [microsoft.com])。そもそも負数の内部表現が2の補数であるとは限りませんし。
Re: (スコア:0)
仮数部のビット数が限られているので、何も考えずに足していくと、
桁合せによって足す値の仮数部がゼロになっちゃうんです。