EXCEL XOR несколько битов

Вы можете использовать логику Not Exists с помощью multiplication двух слагаемых:

  1. decode(Category,'Veggie',1,'Fruits',1,0) - это Zero, т. Е. Not Veggie/Fruits или

  2. nvl2(Date_Distributed,1,0) является Zero ( ноль ), то есть Not Distributed

    with T2( T2_ID, Category, Date_Distributed, T1_ID ) as
    (
     select '01','Veggie', date'2018-01-01', 1 from dual union all   
     select '02','Fruits', date'2018-01-03', 1 from dual union all   
     select '03','Veggie',      null       , 2 from dual union all   
     select '04','Nuts'  , date'2018-01-05', 2 from dual union all   
     select '05','Fruits',      null       , 3 from dual union all   
     select '06','Seeds' , date'2018-01-10', 3 from dual union all    
     select '07','Veggie',      null       , 4 from dual union all   
     select '08','Veggie', date'2018-01-11', 5 from dual union all   
     select '09','Veggie',      null       , 5 from dual union all   
     select '10','Fruit' , date'2018-01-12', 5 from dual union all   
     select '11','Fruit' ,      null       , 5 from dual union all   
     select '12','Nuts'  , date'2018-01-15', 6 from dual union all   
     select '13','Seeds' , date'2018-01-22', 6 from dual union all   
     select '14','Nuts'  ,      null       , 7 from dual 
    )
    select T1_ID       
      from T2 
     group by T1_ID
     having sum(decode(Category,'Veggie',1,'Fruits',1,0)*nvl2(Date_Distributed,1,0))=0
     order by T1_ID;
    
    T1_ID
    -----
      2
      3
      4
      6
      7
    
  3. [ 1119]

    Между прочим, нет необходимости объединяться с T1. Если вы хотите использовать таблицу T1, строку from T2 можно заменить на from T1 join T2 on T1.ID = T2.T1_ID.

    Rextester Demo kbd>

11
задан Patrick Cuff 9 February 2009 в 18:15
поделиться

3 ответа

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

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

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

Ячейка A1 = 0111010

Ячейка A2 = 0101011

=DEC2BIN(BITXOR(BIN2DEC(A1),BIN2DEC(A2)))
24
ответ дан 3 December 2019 в 02:41
поделиться

Можно сделать это с 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)

Получившая строка будет иметь то же число битов как самая длинная строка, в которой Вы передаете.

4
ответ дан 3 December 2019 в 02:41
поделиться

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

Можно разделить его на отдельные столбцы для вышеупомянутой формулы с помощью этого: =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
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: