2

n ビット数の絶対値を取る整数 (num) と整数 (n) を受け取るメソッドに取り組んでいます。私の論理は正しいと信じています。紙の上でそれを行ったところ、うまくいきましたが、コードがずれているようです。すべてのヘルプは大歓迎です!

/**
 * Take the absolute value of an n-bit number.
 * 
 * Examples:
 *     abs(0x00001234, 16); // => 0x00001234
 *     abs(0x00001234, 13); // => 0x00000DCC
 * 
 * Note:  values passed in will only range from 1 to 31 for n.
 * 
 * @param num An n-bit 2's complement number.
 * @param n The bit length of the number.
 * @return The n-bit absolute value of num.
 */
public static int abs(int num, int n)
{
    int shifter = num << (n+1);
    int newInt = num & ~shifter;
    return newInt;

}
4

2 に答える 2

1

Use -1(all 1 bits) for shifter.

int shifter = -1 << n;
于 2013-01-21T02:16:22.337 に答える
1

正と負の両方のケースで機能する単一のビットマスクはないと思います。

最初に、n 番目のビットが 1 であることを確認して、数値が負かどうかをテストします。そうでない場合は元を返し、そうでない場合は 2 の補数を返します。

このようなものは動作するように見えます:

public static int abs(int num, int n)
{
    int shifter = -1 << (n - 1);
    if ((num & shifter) == 0) 
        return num;
    shifter = shifter << 1;
    return (~num + 1) & ~shifter;
}

たとえば、0x1FFF を 16 ビットの数値として渡すと、正になります。
-1 << 150xFFFF8000 (最下位 15 ビットは 0、残りは 1)、0xFFFF8000 & 0x00001FFF は 0 で、元の値を返します。

一方、0x1FFF が 13 ビットのみとして扱われる場合、それは負になります。 num & shifterどちらも 13 番目のビットが設定されているため、1 になります。次に、ビットを反転して 1 を追加することにより、2 の補数を計算します。32 ビットすべてを反転するため、ビットマスクを使用して残りのビットをすべてゼロにする必要があります。オリジナルshifterは、もう 1 つ左に押して反転させると機能します。

于 2013-01-21T02:56:47.170 に答える