思いついたので。
符号あり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の数が得られます。