2016-08-09 15 views
1

のパリティを計算する私は、バイナリ・ワードのパリティを計算し、次のコードを持っている:進ワード

public class Parity1 { 

     public static short parity(long x) { 

     short result = 0; 
     while (x != 0) { 
      result ^= (x & 1); 

      x >>>= 1; 

     } 
     return result; 

     } 

私は1011年のようなものの奇数を持っている場合は、私が100001000のように1、それ以外を取得します、私は1011年を取るworking.Ifコードがどのように見ていないです、0.Howeverを取得する、と私は、次の取得し、それを渡す:

number:1011 
    result : 0 
    result xor (1&1) == 1=>result 
    x >>>=1 => 0101 
    ---------------------- 
    number:0101 
    result : 1 
    result xor (1&1) == 0 => result 
    x >>>=1 => 0010 
    ---------------------- 
    number :0010 
    result : 0 
    result xor (0&1) ==0 => result 
    x >>>=1 => 0001 
    ------------------------ 
    number :0001 
    result : 0 
    result xor (1&1) ==1 => result 
    x >>>=1 => 0000 
    ------------------------ 

    number :0000 
    result : 1 
    result xor (1&1) ==1 => result 
    while (x!=0) but x(number) is 0 
    ends with result 0. 

Can someone please explain what I am missing? 

編集

同じことをするが効率的に行う別の方法があります。しかし、私はあまりにもそれを取得していません。

public static short parity(long x){ 

     short result =0; 


    while (x!=0){ 
    result ^=1; 
    x &= (x-1); 
    } 
    return result; 
    } 
+0

としてそれを呼び出す私は** ** '得るか1 '** **場合私はパリティ(0b1011)と呼ばれるパリティを呼び出します。どうやって*呼びますか? –

+3

最後の繰り返しを忘れました。あなたはちょうどその数が0000であると突然言いますが、最初は0001です。 – harold

+2

あなたは 'Integer.bitCount(n)&1'を使うこともできます。 – msandiford

答えて

2

あなたが投稿したコードが正しく表示されているため、誤って呼び出す可能性があります。 バイナリ番号1011(小数点以下11桁)を使用すると、1を取得するはずですが、を使用する場合は、1を取得する必要があります。そのバイナリ表現は、その中の1の数が偶数の

1111110011 

であるため、小数点以下数1,011(千11)、その後、あなたは 0を取得する必要があります。

あなたが進数1011で機能を呼び出したい場合は、

parity(0b1011) 

ではなく

parity(1011).