EXCEL XOR несколько битов
хорошо, у меня есть две ячейки со строкой битов 0111010 и 0101011. Я хочу XOR два вместе, так что результирующая ячейка будет 0010001.
Я знаю, что вы можете использовать это для булевых значений
=OR(AND(A1,NOT(A2)),AND(A2,NOT(A1)))
но это не работает для строки бит.
5 ответов
для этого вам нужно использовать VBA. Если вы открываете VBA, создайте новый модуль и введите функцию
Public Function BITXOR(x As Long, y As Long)
BITXOR = x Xor y
End Function
затем вы можете использовать DEC2BIN и BIN2DEC для преобразования из двоичного в десятичный для запуска этой функции. Например:
Ячейка 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)
результирующая строка будет иметь такое же количество битов, как и самая длинная строка, которую вы передаете.
вот решение без использования 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),{1000000,100000,10000,1000,100,10,1}),"0000000")
это вычисляет побитовое XOR
С помощью SUMPRODUCT
и TEXT
чтобы преобразовать его в строку битов.
Примечание: эта формула требует, чтобы оба входных значения имели длину 7 (в соответствии с вашим собственным примером), а выход также будет иметь длину 7. Чтобы обеспечить различную длину ввода, просто выполните необходимое усечение и/или заполнение.
вы можно использовать некоторые стенографические определения:
- определение
BitPositions
as={1,2,3,4,5,6,7}
(7-разрядный), - определение
BitStrings
as={1000000,100000,10000,1000,100,10,1}
(7-разрядный), - определение
BitFormat
as="0000000"
(7-разрядный),
тогда вашу формулу можно сделать немного более разборчивой / короче / чище:=TEXT(SUMPRODUCT(MOD(INT(MID(A1,BitPositions,1))+INT(MID(A2,BitPositions,1)),2),BitStrings),BitFormat)
это также упрощает работу с большими строками битов, например:
- определение
BitPositions
as=ROW(INDIRECT("1:32"))
(32-разрядная версия) - определение
BitStrings
as=10^(32-ROW(INDIRECT("1:32")))
(32-бит), - определение
BitFormat
as=REPT("0",32)
(32-разрядная версия)
если вы хотите реализовать NOT
/OR
/AND
/ etc. тогда вы можете получить вдохновение от этих формулы для десятичных аналогов; здесь более подробные объяснения for XOR
С SUMPRODUCT
, хотя он также использует десятичную входов.
=1 - (A10)+(A20) для каждого бита.
вы можете разделить его на отдельные столбцы для приведенной выше формулы, используя это: =MID(A1 / 7 / 1) =MID(A1 / 6 / 1) =MID(A1 / 5 / 1) =MID(A1 / 4 / 1) =MID(A1 / 3 / 1) =Средний(А1|2|1) =Средний(А1|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