2009-02-09 2 views
11

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

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

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

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

ответ

23

Вы должны использовать VBA, чтобы сделать это. Если открыть VBA, создать новый модуль и введите функцию

Public Function BITXOR(x As Long, y As Long) 
    BITXOR = x Xor y 
End Function 

Вы можете использовать DEC2BIN и BIN2DEC для преобразования из двоичного в десятичное для запуска этой функции. Например:

Cell A1 = 0111010

Cell A2 = 0101011

=DEC2BIN(BITXOR(BIN2DEC(A1),BIN2DEC(A2))) 
+1

Спасибо! Для других пользователей, чтобы использовать DEC2BIN, перейдите в Инструменты -> Аддины -> Инструментарий анализа. Чтобы сделать VBA, перейдите в Инструменты -> Макросы -> Редактор Visual Basic –

+0

Немного поздно, но для справки, побитовые операторы VBA также могут обрабатывать нецелые типы (интерпретировать результат так, как вы это сделаете) –

0

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

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

+0

Как вы делаете это для каждой части бит? –

+0

= 1- (A1 <> 0) + (A2 <> 0) для каждого бита. Мне пришлось немного изменить это, чтобы заставить его работать сейчас = INT (ISODD ((A1 <> 0) + (A2 <> 0))) Его работы для ячейки с 1 или 0 в ней, поэтому вам нужно разделить все, над чем вы работаете, например = mid (A1,8,1) ... как он сказал – daniel

4

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

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

0

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


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

  • определяет BitPositions как ={1,2,3,4,5,6,7} (7 бит),
  • определяет BitStrings в ={1000000,100000,10000,1000,100,10,1} (7-бит),
  • определяет BitFormat как ="0000000" (7-разрядный),

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

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

  • определяют BitPositions в =ROW(INDIRECT("1:32")) (32-битный),
  • определяет BitStrings, как =10^(32-ROW(INDIRECT("1:32"))) (32-битный),
  • определяет BitFormat как =REPT("0",32) (32 бит)

Если вы желаете осуществить NOT/OR/AND/etc. то вы можете получить вдохновение от этих formulas for the decimal counterparts; здесь some more in-depth explanations для XOR с SUMPRODUCT, хотя он также использует десятичные входы.