LoginSignup
12
11

More than 5 years have passed since last update.

負の数を0にするビット演算

Last updated at Posted at 2012-05-04

思いついたので。
符号ありint型のみ。

if (x < 0) x = 0;

これが

x &= ~(x >> 31);

これに相当します。

で、何故こうなるかというと…

intは、符号付き整数を32bitで管理しています。
そのうち32個目のビットは符号ビットと呼ばれるもので、
正の時は0、負の時は1を格納しています。

シフト演算子( >> )で右にシフトした場合、符号ビットが引きずられるようになっています。
※ AS3, Javaの場合 >>> を使うと引きずられません

例えば、
0000 0000 0100 1000
を右に2シフトした場合、
0000 0000 0001 0010
になりますが、

1111 1111 1001 0110
を右に2シフトした場合、
1111 1111 1110 0101
となります。

※ 表記上ビットが16個しかありませんが実際は32あります

では、ビットを31右にシフトしてみましょう。
正の場合は、どんな数でも
0000 0000 0000 0000
になりますね。

負の場合は符号ビットが引きずられるので、どんな数でも
1111 1111 1111 1111
になります。

このビット列を反転させると、
正の場合は全て1、負の場合は全て0のビット列が得られます。

後はそれで元の数にマスク(論理積)をかけてやることで、負の場合のみ0の数が得られます。

12
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11