2016-05-11 5 views
0

私はバイナリ文字列を持っているので、結果的にその文字列のいくつかのビットでxor演算を実行したいと思います。 私の文字列は次のとおりです。xor操作を正しく行う方法は?

私は次のコード行を使用して計算を実行しようとしています:

private String ParityCalc(String str){ 
    char[] cA = str.toCharArray(); 
    int[] D = new int[6]; 
    D[0] = D29^cA[0]^cA[1]^cA[2]^cA[4]^cA[5]^cA[9]^cA[10]^cA[11]^cA[12]^cA[13]^cA[16]^cA[17]^cA[19]^cA[22]; 
    D[1] = D30^cA[1]^cA[2]^cA[3]^cA[5]^cA[6]^cA[10]^cA[11]^cA[12]^cA[13]^cA[14]^cA[17]^cA[18]^cA[20]^cA[23]; 
    D[2] = D29^cA[0]^cA[2]^cA[3]^cA[4]^cA[6]^cA[7]^cA[11]^cA[12]^cA[13]^cA[14]^cA[15]^cA[18]^cA[19]^cA[21]; 
    D[3] = D30^cA[1]^cA[3]^cA[4]^cA[5]^cA[7]^cA[8]^cA[12]^cA[13]^cA[14]^cA[15]^cA[16]^cA[19]^cA[20]^cA[22]; 
    D[4] = D30^cA[0]^cA[2]^cA[4]^cA[5]^cA[6]^cA[8]^cA[9]^cA[13]^cA[14]^cA[15]^cA[16]^cA[17]^cA[20]^cA[21]^cA[23]; 
    D[5] = D29^cA[2]^cA[4]^cA[5]^cA[7]^cA[8]^cA[9]^cA[10]^cA[12]^cA[14]^cA[18]^cA[21]^cA[22]^cA[23]; 
    for (int i = 0; i < 6; i++){ 
     if (D[i] == 48){ 
      D[i] = 0; 
     } else if (D[i] == 49){ 
      D[i] = 1; 
     } 
    } 
    StringBuilder parity = new StringBuilder(); 
    parity.append(D[0]).append(D[1]).append(D[2]).append(D[3]).append(D[4]).append(D[5]); 
    D29 = D[4]; 
    D30 = D[5]; 
    return parity.toString(); 
} 

私は最終的にパリティに取得しています結果は次のとおりです。100000 正しい結果は次のようになります。001001.

D29とD30は前回の計算からのパリティビットで、どちらも整数です。

何が間違っているのですか?どのように修正できますか?私はおそらくbitwise操作としてそれを行う必要がありますが、私はそれを把握することはできません。 ご協力いただければ幸いです。

+1

なぜ文字列を整数に変換してもう一度やりますか? –

+0

は、演算がいくつかのビットで連続しているためです。どのようにそれを行うsujestですか? –

+0

まず、元のバイナリ文字列を整数に変換することができ、抽出される特定のビットを別の整数に構築することもできます。場合によります。 –

答えて

0

private String ParityCalc(String str){ 
    int input = Integer.parseInt(str,2); 
    int[] D = new int[6]; 
    D[0] = input & (int)0x4b3e37; // Mask for indices 0,1,2,4,5,9,10,11,12,13,16,17,19,22 
    D[0] = (Integer.bitCount(D[0])&0x1)^D29; // Parity of masked input XOR D29 

// D[1-5] accordingly 

    StringBuilder parity = new StringBuilder(); 
    parity.append(D[0]).append(D[1]).append(D[2]).append(D[3]).append(D[4]).append(D[5]); 
    D29 = D[4]; 
    D30 = D[5]; 
    return parity.toString(); 
} 

マスク:0,1,2,4,5,9,10,11,12,13,16,17,19,22

 
3 3   2   1 
"Position" 
000000000010010110011111000110111 BIN 
    0 0 4 B 3 E 3 7 Hex (4 digits bin = 1 Hex) 
+0

どのようにマスクを生成しましたか?私はあなたがここで何をしたのかよく分かりません: 'D [0] = input&(int)0x4b3e37;'?説明できますか? –

+0

マスクはバイナリで0,1,2,4,5,9、...で1になる番号のちょうど16進数です。I "と"そのマスクでの入力、したがって入力例:10101、マスク:11100、入力&マスク= 10100 – Fildor

+0

次に、1秒:10100 = 2 "1"を数えます。 2で2 = 10(偶数)は0x1 = 0のパリティでマスクされます。それが例えばだった場合。 11100 => 3 "1" s = 11(奇数)&0x1 = 1パリティ。 – Fildor

0

私は次のコードを試してみました。

public static void xor() { 
    final String a = "011001100011100000000011"; 
    final String b = a.substring(3, 7); 
    final long ai = Long.parseLong(a, 2); 
    final long bi = Long.parseLong(b, 2); 
    final long la = Long.toBinaryString(ai).length(); 
    final long lb = Long.toBinaryString(bi).length(); 
    long i,j,fa,fb,fo,result = ai; 
    for (i = 0; i < lb; ++ i) { 
     // get most significant bit one by one; a 
     fb = 1l & (bi >> (lb - i - 1l)); 
     for (j = 0; j < la; ++ j) { 
      // get most significant bit one by one; b 
      fa = 1l & (ai >> (la - j - 1l)); 
      // one^one 
      fo = fa^fb; 
      if (0 == fo) { 
       // & 0 
       result &= ((-1l << la - j) | ((1l << (la - j - 1)) - 1)); 
      } else { 
       // | 1 
       result |= (1l << (la - j - 1l)); 
      } 
     } 
    } 
    System.out.println(result); 
} 

解決策:2つのバイナリ文字列の

Xorの各ビット(整数に変換されます)、それが依存する、(新たな整数であることができる元のバイナリ文字列から変換元の整数の各ビットをリセット)。

問題がある場合はお知らせください。

私のアプローチになり
+0

私はこのコードをそのまま実行しようとしており、何もしません。その結果は最終的にaiパラメータに等しくなります。それは非常に奇妙です。 –

+0

この例は、ビット操作を理解するのに役立ちます。お楽しみください。 –

関連する問題