Frage

Okay, ich habe zwei Zellen mit einer Reihe von Bits 0111010 und 0101011. Ich mag die beide zusammen XOR, so dass die resultierende Zelle wäre 0010001.

Ich weiß, dass Sie dies für Boolesche Werte können

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

, aber es funktioniert nicht für eine Folge von Bits.

War es hilfreich?

Lösung

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

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

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

Zelle A1 = 0111010

Zelle A2 = 0101011

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

Andere Tipps

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.

Mit Ihrem Beispiel A3 enthält:

=XOR_Binary(A1,A2)

Der resultierende String wird die gleiche Anzahl von Bits wie die längste Zeichenfolge haben Sie passieren in.

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

Diese berechnet das bitweise XOR SUMPRODUCT und TEXT unter Verwendung es von Bits in eine Zeichenfolge zu machen.

Hinweis: Diese Formel erfordert beiden Eingangswert Länge haben, 7 (wie pro Ihrem eigenen Beispiel) und der Ausgang wird auch Länge 7. Um für unterschiedliche Eingangslängen zu ermöglichen, implementieren einfach die notwendige Verkürzung und / oder Polsterung.


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

  • definiert BitPositions als ={1,2,3,4,5,6,7} (7-Bit),
  • definiert BitStrings als ={1000000,100000,10000,1000,100,10,1} (7-Bit),
  • definiert BitFormat 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 leichter, mit größeren Ketten von Bits zu arbeiten, z.

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

Sollten Sie wünschen NOT / OR / AND / etc zu implementieren. dann können Sie Ihre Inspiration erhalten von diesen Formeln für die Dezimal-Pendants href="http://www.mcgimpsey.com/excel/bitwise.html"; hier sind einige tiefergehende Erklärungen für XOR mit SUMPRODUCT obwohl es nutzt auch dezimal-Eingaben.

= 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) ...

‘diese VBA gibt eine doppelte, die auf dem Arbeitsblatt formatiert werden muss.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top