簡體   English   中英

如何正確執行異或運算?

[英]how to perform xor operation correctly?

我有一個二進制字符串,我想對該字符串的幾個位執行相應的異或運算。 我的字符串是:

011001100011100000000011

我正在嘗試使用下一行代碼執行計算:

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是根據先前計算進行的奇偶校驗位,均為整數。

我在做什么錯,我該如何解決? 我可能應該將其作為按位操作,但我似乎無法弄清楚。 任何幫助,將不勝感激。

我試過下面的代碼,它想要什么?

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);
}

解:

將兩個二進制字符串的每個位(將轉換為整數)進行異或運算,然后將每個位重置為從原始二進制字符串轉換后的原始整數(可以是新整數,具體取決於)。

如有任何問題,請告訴我。

那就是我的方法:

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
210987654321098765432109876543210 "Position"
000000000010010110011111000110111 BIN
    0   0   4   B   3   E   3   7 Hex (4 digits bin = 1 Hex)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM