[C#][.NET]Exclusive OR(XOR)⊕

部分密碼演算法(Algorithm)有特殊的邏輯運算需求,筆記常用的Exclusive OR(XOR)⊕,順便複習ORAND運算差異。

PIN Blocks、TripleDES..

 

XOR:當兩兩數值相同為否,而數值不同時為真

在C#中其實只要將16進位數值的明文字串轉換為整數/布林/位元組再用^就解決了。

這邊假設都先將運算元轉成位元組再運算

XOR運算

public static byte[] XOR(byte[] bHEX1, byte[] bHEX2)
{
    byte[] bHEX_OUT = new byte[bHEX1.Length];
    for (int i = 0; i < bHEX1.Length; i++)
    {
        bHEX_OUT[i] = (byte)(bHEX1[i] ^ bHEX2[i]);
    }
    return bHEX_OUT;
}

OR運算

public static byte[] OR(byte[] bHEX1, byte[] bHEX2)
{
    byte[] bHEX_OUT = new byte[bHEX1.Length];
    for (int i = 0; i < bHEX1.Length; i++)
    {
        bHEX_OUT[i] = (byte)(bHEX1[i] | bHEX2[i]);
    }
    return bHEX_OUT;
}

AND運算

public static byte[] AND(byte[] bHEX1, byte[] bHEX2)
{
    byte[] bHEX_OUT = new byte[bHEX1.Length];
    for (int i = 0; i < bHEX1.Length; i++)
    {
        bHEX_OUT[i] = (byte)(bHEX1[i] & bHEX2[i]);
    }
    return bHEX_OUT;
}

OK!方法寫好了,來測試一下結果,實驗的2組運算數值如下

0 1 0 1
1 1 0 0
//[運算元1]
byte[] bHEX1 = new byte[] { 0x00, 0x01, 0x00, 0x01 };
//[運算元2]
byte[] bHEX2 = new byte[] { 0x01, 0x01, 0x00, 0x00 };
//[AND運算]
byte[] bAND = AND(bHEX1, bHEX2);
//[OR運算]
byte[] bOR = OR(bHEX1, bHEX2);
//[XOR運算]
byte[] bXOR = XOR(bHEX1, bHEX2);

//[輸出結果]
Console.WriteLine("[AND 運算]");
for (int i = 0; i < 4; i++)
{
    Console.WriteLine("{0} & {1} = {2}", bHEX1[i], bHEX2[i], bAND[i]);
}
Console.WriteLine("");

Console.WriteLine("[OR 運算]");
for (int i = 0; i < 4; i++)
{
    Console.WriteLine("{0} | {1} = {2}", bHEX1[i], bHEX2[i], bOR[i]);
}
Console.WriteLine("");

Console.WriteLine("[XOR:Exclusive OR:異或運算:⊕]");
for (int i = 0; i < 4; i++)
{
    Console.WriteLine("{0} ^ {1} = {2}", bHEX1[i], bHEX2[i], bXOR[i]);
}

運算結果:

表格一下:

運算元1 0 1 0 1
運算元2 1 1 0 0
AND運算 0 1 0 0
OR運算 1 1 0 1
XOR運算 1 0 0 1

 

參考:

^ 運算子

| 運算子

& 運算子