2009-02-09 6 views
11

Okay, ich habe zwei Zellen mit einer Reihe von Bits 0111010 und 0101011. ich die beiden zusammen XOR wollen, so dass die resultierende Zelle 0010001.EXCEL XOR mehrere Bits

würde ich wissen, dass Sie dies für Boolesche Werte verwenden können

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

aber es funktioniert nicht für eine Reihe von Bits.

Antwort

23

Sie müssen verwenden VBA, um dies zu tun. Wenn Sie VBA öffnen, ein neues Modul erstellen und die Funktion

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

Sie können dann die DEC2BIN und BIN2DEC verwenden Eingabe von binären zu konvertieren dezimal diese Funktion auszuführen. Zum Beispiel:

Zelle A1 = 0111010

Zelle A2 = 0101011

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

Danke! Für andere Benutzer, um DEC2BIN zu verwenden gehen Sie zu Extras -> Addins -> Analyse toolpak. Um VBA zu gehen, gehen Sie zu Extras -> Makros -> Visual Basic Editor –

+0

Ein bisschen spät am Tag, aber als Referenz, VBA bitweise Operatoren können auch nicht-integrale Typen behandeln (interpretieren Sie das Ergebnis wie Sie) –

0

= 1- (A1 <> 0) + (A2 <> 0) für jedes Bit.

Sie können es in einzelne Spalten für die obige Formel aufgeteilt mit diesem: = 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) ...

+0

Wie machen Sie das für jeden Bit-Teil obwohl? –

+0

= 1- (A1 <> 0) + (A2 <> 0) für jedes Bit. Ich musste dies ein bisschen ändern, damit es jetzt funktioniert = INT (ISODD ((A1 <> 0) + (A2 <> 0))) Seine funktioniert für eine Zelle mit einer 1 oder 0 darin, so Sie müssen aufteilen, was auch immer Sie arbeiten, wie = Mitte (A1,8,1) ... wie er sagte – daniel

4

Sie können dies tun mit 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 

Wahrscheinlich nicht die beste Umsetzung, aber es funktioniert.

Ihr Beispiel verwenden, A3 enthält:

=XOR_Binary(A1,A2) 

Der resultierende String wird die gleiche Anzahl von Bits wie die längste Zeichenfolge im Pass hat

0

'diese VBA gibt eine doppelt so hoch sein muss. auf dem Arbeitsblatt formatiert.

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

Hier ist eine Lösung ohne 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")

Dieser berechnet das bitweise XORSUMPRODUCT und TEXT mit in eine Folge von Bits zu drehen.

Hinweis: Diese Formel erfordert, dass beide Eingabewerte die Länge 7 haben (wie in Ihrem eigenen Beispiel) und die Ausgabe hat auch die Länge 7. Um unterschiedliche Eingabedaten zu ermöglichen, implementieren Sie einfach die erforderliche Kürzung und/oder Auffüllung .


Sie können wählen, einige Stenografie Definitionen verwenden:

  • definieren BitPositions als ={1,2,3,4,5,6,7} (7-Bit),
  • definieren BitStrings als ={1000000,100000,10000,1000,100,10,1} (7-Bit),
  • BitFormat definieren als ="0000000" (7-Bit),

dann können Sie Ihre Formel ein bisschen mehr lesbar/kürzer/Reiniger vorgenommen werden:
=TEXT(SUMPRODUCT(MOD(INT(MID(A1,BitPositions,1))+INT(MID(A2,BitPositions,1)),2),BitStrings),BitFormat)

Dies macht es auch einfacher, mit größeren Ketten von Bits zu arbeiten, zB:

  • definieren BitPositions als =ROW(INDIRECT("1:32")) (32-bit),
  • BitStrings als =10^(32-ROW(INDIRECT("1:32"))) (32-Bit) zu definieren,
  • BitFormat als =REPT("0",32) (32-Bit definieren)

Möchten Sie implementieren NOT/OR/AND/etc. dann können Sie Ihre Inspiration von diesen formulas for the decimal counterparts bekommen; Hier sind some more in-depth explanations für XOR mit SUMPRODUCT, obwohl es auch Dezimal-Eingänge verwendet.