EXCEL异或多位
好的,我有两个单元格,有一串011010和0101011位。我想将二者异或在一起,这样得到的单元格将是0010001 我知道你可以用它来表示布尔值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) =中间(
=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。为了允许不同的输入长度,只需实现必要的截断和/或填充
您可以选择使用一些速记定义:
- 将
位位置定义为
(7位)={1,2,3,4,5,6,7}
- 将
位字符串定义为
(7位)={1000000100001000100,10,1}
- 将
位格式定义为
(7位)=“0000000”
=文本(SUMPRODUCT(MOD(INT(MID(A1,位位置,1))+INT(MID(A2,位位置,1)),2),位字符串),位格式)
这也使处理较大的位串变得更容易,例如:
- 将
位位置定义为
(32位)=行(间接(“1:32”)
- 将
位字符串定义为
(32位)=10^(32行(间接(“1:32”))
- 将
位格式定义为
(32位)=REPT(“0”,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