EXCEL XOR несколько бит

Хорошо, у меня две ячейки со строкой бит 0111010 и 0101011. Я хочу, чтобы XOR два вместе, чтобы результирующая ячейка была 0010001.

Я знаю, что вы можете использовать это для логических значений

=OR(AND(A1,NOT(A2)),AND(A2,NOT(A1)))

но он не работает для строки бит.

Ответ 1

Для этого вам нужно использовать 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)))

Ответ 2

Вы можете сделать это с помощью 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 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)

Результирующая строка будет иметь такое же количество бит, как и самая длинная строка, в которую вы проходите.

Ответ 3

Вот решение без использования 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. Чтобы разрешить разные длины ввода, просто выполните необходимое усечение и/или дополнение.


Вы можете использовать некоторые сокращенные определения:

  • define BitPositions как ={1,2,3,4,5,6,7} (7 бит),
  • define BitStrings как ={1000000,100000,10000,1000,100,10,1} (7 бит),
  • define BitFormat как ="0000000" (7-бит),

тогда ваша формула может быть сделана немного более разборчивой/короче/чище:
=TEXT(SUMPRODUCT(MOD(INT(MID(A1,BitPositions,1))+INT(MID(A2,BitPositions,1)),2),BitStrings),BitFormat)

Это также упрощает работу с большими строками бит, например:

  • define BitPositions как =ROW(INDIRECT("1:32")) (32-разрядный),
  • define BitStrings как =10^(32-ROW(INDIRECT("1:32"))) (32-разрядный),
  • define BitFormat как =REPT("0",32) (32-разрядный)

Если вы хотите реализовать NOT/OR/AND/etc. то вы можете получить вдохновение из этих формул для десятичных копий; здесь несколько более подробных объяснений для XOR с SUMPRODUCT, хотя он также использует десятичные входы.

Ответ 4

= 1- (A1 < > 0) + (A2 < > 0) для каждого бита.

Вы можете разбить его на отдельные столбцы для приведенной выше формулы, используя это: = MID (A1 | 7 | 1) = MID (A1 | 6 | 1) = MID (A1 | 5 | 1) = MID (A1 | 4 | 1) = MID (A1 | 3 | 1) = MID (A1 | 2 | 1) = MID (A1 | 1 | 1) ...

Ответ 5

'этот 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