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")
这将使用SUMPRODUCT
和TEXT
来计算按位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
/等。 那么你可以从这些公式中得到你的灵感, 这里有一些更深入的XOR
与SUMPRODUCT
解释 ,虽然它也使用十进制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