and - ejemplos de xor en excel
EXCEL XOR múltiples bits (5)
De acuerdo, tengo dos celdas con una cadena de bits 0111010 y 0101011. Quiero unir XOR los dos juntos para que la celda resultante sea 0010001.
Sé que puedes usar esto para valores booleanos
=OR(AND(A1,NOT(A2)),AND(A2,NOT(A1)))
pero no funciona para una cadena de bits.
= 1- (A1 <> 0) + (A2 <> 0) para cada bit.
Puede dividirlo en columnas individuales para la fórmula anterior usando esto: = 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) ...
Necesita usar VBA para hacer esto. Si abre VBA, cree un nuevo Módulo e ingrese la función
Public Function BITXOR(x As Long, y As Long)
BITXOR = x Xor y
End Function
A continuación, puede usar DEC2BIN y BIN2DEC para convertir de binario a decimal para ejecutar esta función. Por ejemplo:
Celda A1 = 0111010
Celda A2 = 0101011
=DEC2BIN(BITXOR(BIN2DEC(A1),BIN2DEC(A2)))
Puedes hacer esto con 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
Probablemente no sea la mejor implementación, pero funciona.
Usando su ejemplo, A3
contiene:
=XOR_Binary(A1,A2)
La cadena resultante tendrá la misma cantidad de bits que la cadena más larga que ingrese.
''este VBA devuelve un doble que debe formatearse en la hoja de trabajo.
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
Aquí hay una solución sin usar 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")
Esto calcula el XOR
bit a bit utilizando SUMPRODUCT
y TEXT
para convertirlo en una cadena de bits.
Nota: esta fórmula requiere que ambos valores de entrada tengan una longitud de 7 (según su propio ejemplo) y la salida también tendrá una longitud de 7. Para permitir diferentes longitudes de entrada, simplemente implemente el truncamiento y / o relleno necesarios.
Puedes elegir usar algunas definiciones abreviadas:
- definir
BitPositions
como={1,2,3,4,5,6,7}
(7-bit), - define
BitStrings
como={1000000,100000,10000,1000,100,10,1}
(7-bit), - definir
BitFormat
como="0000000"
(7-bit),
entonces tu fórmula se puede hacer un poco más legible / más corta / más limpia:
=TEXT(SUMPRODUCT(MOD(INT(MID(A1,BitPositions,1))+INT(MID(A2,BitPositions,1)),2),BitStrings),BitFormat)
Esto también hace que sea más fácil trabajar con cadenas de bits más grandes, por ejemplo:
- definir
BitPositions
como=ROW(INDIRECT("1:32"))
(32 bits), - define
BitStrings
como=10^(32-ROW(INDIRECT("1:32")))
(32-bit), - define
BitFormat
como=REPT("0",32)
(32 bits)
Si desea implementar NOT
/ OR
/ AND
/ etc. entonces puede obtener su inspiración de estas fórmulas para las contrapartes decimales ; Aquí hay algunas explicaciones más profundas para XOR
con SUMPRODUCT
aunque también utiliza entradas decimales.