EXCEL XOR多个位

好吧,我有两个单元格0111010和0101011位的string。我想XOR二者在一起,以便产生的单元格将是0010001。

我知道你可以使用这个布尔值

=OR(AND(A1,NOT(A2)),AND(A2,NOT(A1))) 

但它不适用于一串位。

您需要使用VBA来执行此操作。 如果打开VBA,请创build一个新模块并input该function

 Public Function BITXOR(x As Long, y As Long) BITXOR = x Xor y End Function 

然后您可以使用DEC2BIN和BIN2DEC从二进制转换为十进制运行此function。 例如:

单元格A1 = 0111010

单元格A2 = 0101011

 =DEC2BIN(BITXOR(BIN2DEC(A1),BIN2DEC(A2))) 

你可以用VBA做到这一点:

 Public Function XOR_binary(b1, b2) As String Dim len_b1 Dim len_b2 Dim len_diff Dim i Dim bit1 Dim bit2 ' see if the two string are the same length. If not, add 0's to ' the beginning of the shorter string len_b1 = Len(b1) len_b2 = Len(b2) len_diff = len_b1 - len_b2 Select Case len_diff Case Is < 0 ' b2 is longer b1 = String(Abs(len_diff), "0") & b1 Case Is = 0 ' they're the same length Case Is > 0 ' b1 is longer b2 = String(len_diff, "0") & b2 End Select XOR_binary = "" For i = Len(b2) To 1 Step -1 bit1 = CInt(Mid(b1, i, 1)) bit2 = CInt(Mid(b2, i, 1)) XOR_binary = CInt(bit1 Xor bit2) & XOR_binary Next i End Function 

可能不是最好的实现,但它的工作原理。

用你的例子, A3包含:

 =XOR_Binary(A1,A2) 

生成的string将具有与您传入的最长string相同的位数。

这是一个不使用VBA的解决scheme:
=TEXT(SUMPRODUCT(MOD(INT(MID(A1,{1,2,3,4,5,6,7},1))+INT(MID(A2,{1,2,3,4,5,6,7},1)),2),{1000000,100000,10000,1000,100,10,1}),"0000000")

这将使用SUMPRODUCTTEXT来计算按位XOR ,将其变成一串位。

注意:这个公式要求两个input值的长度都是7(根据你自己的例子),输出的长度也是7.为了允许不同的input长度,只需要实现必要的截断和/或填充。


你可以select使用一些速记的定义:

  • BitPositions定义为={1,2,3,4,5,6,7} (7位),
  • BitStrings定义为={1000000,100000,10000,1000,100,10,1} (7位),
  • BitFormat定义为="0000000" (7位),

那么你的公式可以变得更清晰/更短/更清洁:
=TEXT(SUMPRODUCT(MOD(INT(MID(A1,BitPositions,1))+INT(MID(A2,BitPositions,1)),2),BitStrings),BitFormat)

这也使得更容易处理更大的比特串,例如:

  • BitPositions定义为=ROW(INDIRECT("1:32")) (32-bit),
  • BitStrings定义为=10^(32-ROW(INDIRECT("1:32"))) (32-bit),
  • BitFormat定义为=REPT("0",32) (32位)

如果你想实施NOT / OR / AND /等。 那么你可以从这些公式中得到你的灵感, 这里有一些更深入的XORSUMPRODUCT 解释 ,虽然它也使用十进制input。

= 1-(A1≠0)+(A2≠0)。

您可以使用以下公式将上述公式拆分为单独的列:= MID(A1 | 6 | 1)= MID(A1 | 5 | 1)= MID(A1 | 4 | 1) = MID(A1 | 3 | 1)= MID(A1 | 2 | 1)= MID(A1 | 1 | 1)…

'这个VBA返回一个必须在工作表上格式化的double。

 Option Explicit Public Function MYXOR(r1 As Range, r2 As Range) As Double 'r1 and r2 are expected as HEX; for example, 'DEC2HEX(CODE("B")) returns ASCII of "B" as HEX On Error GoTo ErrHandler MYXOR = "&H" & r1.Value Xor "&H" & r2.Value GoTo CleanUp ErrHandler: MYXOR = Err.Number Resume CleanUp CleanUp: ' format the double being returned in MYXOR with TEXT(DEC2HEX(MYXOR(C9,F9)),"00000") ' number of leading zeroes according to the size of the HEX in r1 and r2 End Function