What does bitwise XOR (exclusive OR) mean?

前端 未结 8 1236
眼角桃花
眼角桃花 2020-12-02 05:52

I\'m trying to understand the binary operators in C# or in general, in particular ^ - exclusive or.

For example:

Given an array of positive intege

相关标签:
8条回答
  • 2020-12-02 06:48

    This has a lot of samples of various functionalities done by bit fiddling. Some of can be quite complex so beware.

    What you need to do to understand the bit operations is, at least, this:

    • the input data, in binary form
    • a truth table that tells you how to "mix" the inputs to form the result

    For XOR, the truth table is simple:

    1^1 = 0
    1^0 = 1
    0^1 = 1
    0^0 = 0
    

    To obtain bit n in the result you apply the rule to bits n in the first and second inputs.

    If you try to calculate 1^1^0^1 or any other combination, you will discover that the result is 1 if there is an odd number of 1's and 0 otherwise. You will also discover that any number XOR'ed with itself is 0 and that is doesn't matter in what order you do the calculations, e.g. 1^1^(0^1) = 1^(1^0)^1.

    This means that when you XOR all the numbers in your list, the ones which are duplicates (or present an even number of times) will XOR to 0 and you will be left with just the one which is present an odd number of times.

    0 讨论(0)
  • I know this is a rather old post but I wanted simplify the answer since I stumbled upon it while looking for something else.
    XOR (eXclusive OR/either or), can be translated simply as toggle on/off.
    Which will either exclude or include the specified bits.

    Using 4 bits (1111) we get 16 possible results from 0-15:

     decimal | binary | expanded
           0 | 0000   |
           1 | 0001   |
           2 | 0010   | 
           3 | 0011   | (1+2)
           4 | 0100   |
           5 | 0101   | (1+4)
           6 | 0110   | (2+4) 
           7 | 0111   | (1+2+4)
           8 | 1000   |
           9 | 1001   | (1+8)
          10 | 1010   | (2+8)
          11 | 1011   | (1+2+8)
          12 | 1100   | (4+8)
          13 | 1101   | (1+4+8)
          14 | 1110   | (2+4+8)
          15 | 1111   | (1+2+4+8)
    

    The decimal value to the left of the binary value, is the numeric value used in XOR and other bitwise operations, that represents the total value of associated bits. See Computer Number Format and Binary Number - Decimal for more details.

    For example: 0011 are bits 1 and 2 as on, leaving bits 4 and 8 as off. Which is represented as the decimal value of 3 to signify the bits that are on, and displayed in an expanded form as 1+2.


    As for what's going on with the logic behind XOR here are some examples
    From the original post

    2^3 = 1

    • 2 is a member of 1+2 (3) remove 2 = 1

    2^5 = 7

    • 2 is not a member of 1+4 (5) add 2 = 1+2+4 (7)

    2^10 = 8

    • 2 is a member of 2+8 (10) remove 2 = 8

    Further examples

    1^3 = 2

    • 1 is a member of 1+2 (3) remove 1 = 2

    4^5 = 1

    • 4 is a member of 1+4 (5) remove 4 = 1

    4^4 = 0

    • 4 is a member of itself remove 4 = 0

    1^2^3 = 0
    Logic: ((1^2)^(1+2))

    • (1^2) 1 is not a member of 2 add 2 = 1+2 (3)
    • (3^3) 1 and 2 are members of 1+2 (3) remove 1+2 (3) = 0

    1^1^0^1 = 1
    Logic: (((1^1)^0)^1)

    • (1^1) 1 is a member of 1 remove 1 = 0
    • (0^0) 0 is a member of 0 remove 0 = 0
    • (0^1) 0 is not a member of 1 add 1 = 1

    1^8^4 = 13
    Logic: ((1^8)^4)

    • (1^8) 1 is not a member of 8 add 1 = 1+8 (9)
    • (9^4) 1 and 8 are not members of 4 add 1+8 = 1+4+8 (13)

    4^13^10 = 3
    Logic: ((4^(1+4+8))^(2+8))

    • (4^13) 4 is a member of 1+4+8 (13) remove 4 = 1+8 (9)
    • (9^10) 8 is a member of 2+8 (10) remove 8 = 2
    • 1 is not a member of 2+8 (10) add 1 = 1+2 (3)

    4^10^13 = 3
    Logic: ((4^(2+8))^(1+4+8))

    • (4^10) 4 is not a member of 2+8 (10) add 4 = 2+4+8 (14)
    • (14^13) 4 and 8 are members of 1+4+8 (13) remove 4+8 = 1
    • 2 is not a member of 1+4+8 (13) add 2 = 1+2 (3)
    0 讨论(0)
提交回复
热议问题