2009-02-09 9 views
11

bien tengo dos células con una cadena de bits 0111010 y 0101011. Quiero XOR los dos juntos para que la célula resultante sería 0010001.EXCEL XOR múltiples bits

Sé que usted puede utilizar esto para valores booleanos

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

pero no funciona para una cadena de bits.

Respuesta

23

Es necesario utilizar VBA para hacer esto. Si abre VBA, crear un nuevo módulo y escriba la función

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

A continuación, puede utilizar el DEC2BIN y BIN2DEC convertir de binario a decimal para ejecutar esta función. Por ejemplo:

La celda A1 = 0111010

celda A2 = 0101011

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

¡Gracias! Para otros usuarios, para usar DEC2BIN vaya a Herramientas -> Complementos -> Herramientas de análisis. Para hacer VBA vaya a Herramientas -> Macros -> Editor de Visual Basic –

+0

Un poco tarde en el día, pero como referencia, los operadores bit a bit de VBA también pueden manejar tipos no integrales (interprete el resultado como lo hará) –

0

= 1- (A1 <> 0) + (A2 <> 0) para cada bit.

Puede dividirlo en columnas individuales de la fórmula anterior que utiliza este: = 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

¿Cómo se hace para cada parte de bit sin embargo? –

+0

= 1- (A1 <> 0) + (A2 <> 0) para cada bit. Tuve que modificar esto un poco para que funcione ahora = INT (ISODD ((A1 <> 0) + (A2 <> 0))) Funciona para una celda con 1 o 0 en ella, por lo tienes que dividir lo que sea que estés trabajando, como = medio (A1, 8, 1) ... como dijo – daniel

4

Usted puede 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 es la mejor aplicación, pero funciona.

Usando su ejemplo, A3 contiene:

=XOR_Binary(A1,A2) 

La cadena resultante tendrá el mismo número de bits como la cadena más larga se pasa en

0

'esta VBA devuelve un doble que tiene que ser. formateado 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 
3

Aquí es 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")

Este calcula el bit a bit usando XORSUMPRODUCT y TEXT para convertirlo en una cadena de bits.

Nota: esta fórmula requiere dos valores de entrada para tener una longitud 7 (como por su propio ejemplo) y la salida también tendrá longitud 7. Para permitir diferentes longitudes de entrada, simplemente aplicar el truncamiento y/o material de relleno necesario .


Puede optar por utilizar algunas definiciones abreviadas:

  • definen BitPositions como ={1,2,3,4,5,6,7} (7 bits),
  • definen BitStrings como ={1000000,100000,10000,1000,100,10,1} (7 bits),
  • definir BitFormat como ="0000000" (7-bit),

entonces su fórmula se puede hacer un poco más legible/más corto/Limpiador:
=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 cuerdas mayor de bits, por ejemplo:

  • definen BitPositions como =ROW(INDIRECT("1:32")) (32-bit),
  • definen BitStrings como =10^(32-ROW(INDIRECT("1:32"))) (32-bit),
  • definen BitFormat como =REPT("0",32) (32-bit)

Si desea implementar NOT/OR/AND/etc. entonces puedes obtener tu inspiración de estos formulas for the decimal counterparts; aquí están some more in-depth explanations para XOR con SUMPRODUCT aunque también usa entradas decimales.

Cuestiones relacionadas