2016-05-11 13 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 - это биты четности, выполненные по предыдущим вычислениям, оба являются целыми числами.

что я делаю неправильно и как я могу это исправить? я должен, вероятно, сделать это как побитую операцию, но я не могу понять, как это понять. любая помощь будет оценена.

+1

Почему бы не преобразовать строку в целое число и сделать это снова? –

+0

, потому что операция последовательна на нескольких битах. как вы могли бы это сделать? –

+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

Маска просто Hex для числа, где в двоичном виде было бы 1 с в 0,1,2,4,5,9, ...I "и" ввод с этой маской, поэтому введите пример: 10101, Mask: 11100, затем введите & mask = 10100 – Fildor

+0

Затем вы считаете 1s: 10100 = 2 "1"; 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); 
} 

Решение:

Xor каждый бит из двух двоичной строки (будет преобразован в целое число) и сброса каждого бита обратно в исходное целое число, которое преобразуется из исходной двоичной строки (может быть новым целым числом, это зависит).

Пожалуйста, дайте мне знать, если возникнут проблемы.

+0

Я попытался запустить этот код как есть, и он ничего не делает. результат в конечном итоге равен параметру ai. что очень странно. –

+0

Этот пример поможет вам понять бит операции. Наслаждайся. –