EXCEL异或多位

EXCEL异或多位,excel,xor,Excel,Xor,好的,我有两个单元格,有一串011010和0101011位。我想将二者异或在一起,这样得到的单元格将是0010001 我知道你可以用它来表示布尔值 =OR(AND(A1,NOT(A2)),AND(A2,NOT(A1))) 但它不适用于一串位。=1-(A10)+(A20)用于每个位 您可以使用以下方法将其拆分为上述公式的各个列: =中等(A1 | 7 | 1) =中等(A1 | 6 | 1) =中等(A1 | 5 | 1) =中间(A1 | 4 | 1) =中间(A1 | 3 | 1) =中间(

好的,我有两个单元格,有一串011010和0101011位。我想将二者异或在一起,这样得到的单元格将是0010001

我知道你可以用它来表示布尔值

=OR(AND(A1,NOT(A2)),AND(A2,NOT(A1)))
但它不适用于一串位。

=1-(A10)+(A20)用于每个位

您可以使用以下方法将其拆分为上述公式的各个列: =中等(A1 | 7 | 1) =中等(A1 | 6 | 1) =中等(A1 | 5 | 1) =中间(A1 | 4 | 1) =中间(A1 | 3 | 1) =中间(A1 | 2 | 1) =中间(A1 | 1 | 1)
…您需要使用VBA来执行此操作。如果打开VBA,请创建新模块并输入函数

Public Function BITXOR(x As Long, y As Long)
    BITXOR = x Xor y
End Function
然后可以使用DEC2BIN和BIN2DEC将二进制转换为十进制来运行此函数。例如:

单元A1=01111010

单元格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

结果字符串的位数将与传入的最长字符串的位数相同。

'此VBA返回必须在工作表上格式化的双精度值

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

下面是一个不使用VBA的解决方案:
=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),{10000000000100001000001000100001000,10,1}),“0000000”)

这将使用
SUMPRODUCT
TEXT
来计算按位异或

注意:此公式要求输入值的长度为7(根据您自己的示例),输出值的长度也为7。为了允许不同的输入长度,只需实现必要的截断和/或填充


您可以选择使用一些速记定义:

  • 位位置定义为
    ={1,2,3,4,5,6,7}
    (7位)
  • 位字符串定义为
    ={1000000100001000100,10,1}
    (7位)
  • 位格式定义为
    =“0000000”
    (7位)
然后您的公式可以变得更清晰/更短/更干净:
=文本(SUMPRODUCT(MOD(INT(MID(A1,位位置,1))+INT(MID(A2,位位置,1)),2),位字符串),位格式)

这也使处理较大的位串变得更容易,例如:

  • 位位置定义为
    =行(间接(“1:32”)
    (32位)
  • 位字符串定义为
    =10^(32行(间接(“1:32”))
    (32位)
  • 位格式定义为
    =REPT(“0”,32)
    (32位)

如果您希望实现
而不是
/
/
/等,那么您可以从中获得灵感;这里是关于
XOR
SUMPRODUCT
的,尽管它也使用十进制输入。

但是如何对每个位部分进行计算?=1-(A10)+(A20)。我不得不稍微修改一下,让它现在工作=INT(ISODD((A10)+(A20)),它适用于一个包含1或0的单元格,所以你必须拆分你正在处理的任何内容,比如=mid(A1,8,1)。。。就像他说的汉克斯!对于其他用户,要使用DEC2BIN,请转到工具->加载项->分析工具包。要执行VBA,请在一天的晚些时候转到工具->宏->Visual Basic编辑器,但作为参考,VBA的逐位运算符也可以处理非整数类型(按您的意愿解释结果)
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