如何在Excel 2007中执行两个二进制数的XORparsing

我想对两个二进制数进行XOR计算,例如:在表1上

Range A1 = 10101010 Range A2 = 11100010 

现在我需要执行A1的XOR,A2导致A3。 我尝试了不同的公式的两个执行XOR计算,如: A1^A2, (BITXOR (A1, A2))但不幸的是,它不工作,我想因为我使用Excel 2007“XOR”不支持。

我期待1001000的结果。

首先,您应该注意,Excel pre-Excel2013中没有内置的按位运算符或函数(即使操作数是数字,Excel的OR()函数也是逻辑的)。 Excel 2013终于增加了这个明显缺失的function。

使用VBA

最简单的方法是创build一个用户自定义函数。 如果您准备好了十进制输出,辅助列或重复的连接公式,公式可以工作,但是VBA可以解决这些限制 – 如果您能够在工作簿中拥有代码,我推荐它。

十进制input,十进制输出

下面的示例只是公开内置的按位运算符在Excel公式中作为函数使用。 我假设一个整数types,虽然你可以改变它接受小数等

您可以使用Excel中内置的BIN2DEC()函数将string的二进制数(例如“1010”)转换为小数(前面的示例为10),但这只能处理9位+符号位,或者可以使用数组公式来转换它(请参阅下面的“使用公式”一节)。

 Public Function BITWISE_OR(operand1, operand2) BITWISE_OR = CLng(operand1) Or CLng(operand2) End Function Public Function BITWISE_AND(operand1, operand2) BITWISE_AND = CLng(operand1) And CLng(operand2) End Function Public Function BITWISE_XOR(operand1, operand2) BITWISE_XOR = CLng(operand1) Xor CLng(operand2) End Function 

将数字结果转换回二进制string对于公式来说非常烦人 – 如果您需要比Excel内置的DEC2BIN()(一个微不足道的-512至+511)函数覆盖的范围更多的话,那么我会build议使用VBA(见下文),或者使用列或行来逐个构build你的二进制string(参见下面的使用公式部分)。

二进制stringinput,二进制string输出

下面基本上是依据inputstring中相应的位依次迭代一个string来设置每个位。 它使用Mid$语句就地对string执行位更改。 位串可以是任意的长度。

下面看起来很复杂,但实际上它是和And,Or和XOr重复3次相同的基本东西。

 'str1, str2: the two bit strings. They can be different lengths. 'significantDigitsAreLeft: optional parameter to dictate how different length strings should be padded. Default = True. Public Function Bitstr_AND(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True) Dim maxLen As Long, resStr As String, i As Long If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2) 'get max length of the two strings str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft) 'pad left or right to the desired length str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft) 'pad left or right to the desired length resStr = String$(maxLen, "0") 'prepare the result string into memory (Mid$ can operate without creating a new string, for performance) For i = 1 To maxLen If Mid$(str1, i, 1) = "1" And Mid$(str2, i, 1) = "1" Then Mid$(resStr, i, 1) = "1" 'in-place overwrite of the existing "0" with "1" End If Next i Bitstr_AND = resStr End Function 'For explanatory comments, see Bitstr_AND Public Function Bitstr_OR(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True) Dim maxLen As Long Dim resStr As String Dim i As Long If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2) str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft) str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft) resStr = String$(maxLen, "0") For i = 1 To maxLen If Mid$(str1, i, 1) = "1" Or Mid$(str2, i, 1) = "1" Then Mid$(resStr, i, 1) = "1" End If Next i Bitstr_OR = resStr End Function 'For explanatory comments, see Bitstr_AND Public Function Bitstr_XOR(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True) Dim maxLen As Long Dim resStr As String Dim i As Long If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2) str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft) str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft) resStr = String$(maxLen, "0") For i = 1 To maxLen If Mid$(str1, i, 1) = "1" Then If Not Mid$(str2, i, 1) = "1" Then Mid$(resStr, i, 1) = "1" End If ElseIf Mid$(str2, i, 1) = "1" Then 'Save an If check by assuming input string contains only "0" or "1" Mid$(resStr, i, 1) = "1" End If Next i Bitstr_XOR = resStr End Function 'Helper to pad string Private Function getPaddedString(str As String, length As Long, padLeft As Boolean) As String If Len(str) < length Then If padLeft Then getPaddedString = String$(length - Len(str), "0") & str Else getPaddedString = str & String$(length - Len(str), "0") End If Else getPaddedString = str End If End Function 

使用公式

您可以使用文本函数或Sumproduct执行XOR操作。 如果你不想使用VBA,这可能会更合适,但是公式很痛苦,以确保它们覆盖所有情况 ,比如否定或不同长度的二进制string。 我把你推荐给那些使用Sumproduct的例子的博客文章http://www.excelhero.com/blog/2010/01/5-and-3-is-1.html ,以及http://chandoo.org/wp / 2011/07/29 / bitwise-operations-in-excel /例如使用文本function。

我制作了自己的公式来处理某些情况,下面解释它们来指导你。

二进制stringinput,十进制输出

在下面,A2和B2是指最多32位stringforms的两个二进制数字。 string可以是可变长度的,因为公式将以0填充到必要的长度。 如何将其增加到更多位应该是显而易见的。 必须使用Ctrl + Shift + Enterinput

最重要的位在左边。 为了使它在左边最不重要的位,你可以删除在2部分权力的小减法,并使其垫。

按位和:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))=2)*(2^(32-ROW($1:$32))))

按位或:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))>0)*(2^(32-ROW($1:$32))))

按位异或:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))=1)*(2^(32-ROW($1:$32))))

二进制stringinput,二进制string输出

单个单元格解决scheme会很费劲,因为在Excel中没有数组级联公式。 你可以使用CONCATENATE函数将每个位粘合在一起,每个位都是If的结果,如果比较每个返回1或0的二进制string。 正如我所说,虽然容易(只要build立起来像= IF(Mid(A1,1,1)=“1”,…),这将是无聊的,所以我个人不会为你做;)

或者,你可以更简单地使用列或行来build立string,如:如果A1和B1有你的二进制string,那么在C1放(对于AND或OR)将末尾的= 2更改为> 0和XOR将其更改为= 1):

=IF((MID($A1,1,1)="1")+(MID($B1,1,1)="1"))=2 ,“1”,“0”)

然后在D1里放:

=C1 & IF((MID($A1,COLUMN()-COLUMN($C1),1)="1")+(MID($B1,COLUMN()-COLUMN($C1),1)="1"))=2,"1","0")

然后将其拖动到与位数相同的列上