2

ビット演算子を使用して int の符号を変更するには? 明らかにx*=-1orを使用できますx/=-1。これを行う最速の方法はありますか?

以下のように小さなテストを行いました。ただの好奇心...

public class ChangeSign {
    public static void main(String[] args) {
        int x = 198347;
        int LOOP = 1000000;
        int y;
        long start = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = (~x) + 1;
        }
        long mid1 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = -x;
        }
        long mid2 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = x * -1;
        }
        long mid3 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = x / -1;
        }
        long end = System.nanoTime();
        System.out.println(mid1 - start);
        System.out.println(mid2 - mid1);
        System.out.println(mid3 - mid2);
        System.out.println(end - mid3);
    }
}

出力は次のようになります。

2200211
835772
1255797
4651923
4

3 に答える 3

15

非浮動小数点 (int math など) の加算/乗算とビット演算の速度差は、ほとんどすべてのマシンで無視できるほど小さくなります。

否定演算は のようx = (~x) + 1になり、加算が 1 つ必要になるため、ビット演算のみを使用して n ビットの符号付き整数を負の等価物に変換する一般的な方法はありません。ただし、符号付き整数が 32 ビットであると仮定すると、この計算を行うためのビット単位の方程式を書くことができます。: これは行わないでください。

数値を否定する最も一般的で読みやすい方法はx = -x.

于 2012-07-23T15:48:09.780 に答える
8

Java は補数 2 表現を使用します。符号を変更するには、ビット単位の否定 (FFFF を使用した xor と同等) を実行して 1 を追加する必要があることを意味します。

x = ~x + 1;

-xどちらかといえば、それよりも速いとほぼ確信しています。

于 2012-07-23T15:51:36.347 に答える