How to think about bitwise operations for simple operations?

eg:

unsigned int a;    // value to merge in non-masked bits
unsigned int b;    // value to merge in masked bits
unsigned int mask; // 1 where bits from b should be selected; 0 where from a.
unsigned int r;    // result of (a & ~mask) | (b & mask) goes here

r = a ^ ((a ^ b) & mask); 

combines bits from two values ​​according to a mask.

[taken from here ]

In this case, I see that it works, but I'm not sure what logic is. And I'm not sure I can create my own bitwise operations like this from scratch. How to start thinking in bits?

+3
source share
9 answers

In this case, I see that it works, but I'm not sure what the logic is? And I'm not sure I can create my own bitwise operations like this from scratch. How to start thinking in bits?

- . , , , - . (, , , , ​​).

  • , .
  • FULL.
  • , . .
  • ???
  • Profit

, . .. A B. (0 - A, 1 - B)

1 . , , :) (? 2 ^ (2bits * 3inputs) = 64 :( 2 ^ (3bits * 3inputs) = 512 : (( )

, , 1 100% . Infact :)

| A | B | M || R |
============++====
| 0 | 0 | 0 || 0 |
| 0 | 0 | 1 || 0 |
| 0 | 1 | 0 || 0 |
| 0 | 1 | 1 || 1 |
| 1 | 0 | 0 || 1 |
| 1 | 0 | 1 || 0 |
| 1 | 1 | 0 || 1 |
| 1 | 1 | 1 || 1 |

, , .

? : KMaps . , ?:)

, R , :

| A | B | M || R |
============++====
| 0 | 1 | 1 || 1 |
| 1 | 0 | 0 || 1 |
| 1 | 1 | 0 || 1 |
| 1 | 1 | 1 || 1 |

:

R = (~A &  B &  M) |
    ( A & ~B & ~M) |
    ( A &  B & ~M) |
    ( A &  B &  M) |

, , : , . , - nthere.

python:

a = 0xAE #10101110b
b = 0x64 #01100011b
m = 0xF0 #11110000b
r = (~a & b & m) | ( a & ~b & ~m) | ( a &  b & ~m) | ( a &  b &  m)
print hex(r)

:

0x6E

. 0x6E, 01101110b. ! . (ps, ~ r , . , r 0).

, , " ", Disjunctive Normal Form, DNF , . . - , , , 500000 Uni ' CS, . ( :))

, ( , ):

(~a & b & m) | ( a & ~b & ~m) | ( a &  b & ~m) | ( a &  b &  m)
|= ((~a & b & m) | ( a & ~b & ~m)) | ( a &  b & ~m) | ( a &  b &  m)

, :

((~a & b & m) | ( a & ~b & ~m))

|= (~a | (a & ~b & ~m)) & (b | ( a & ~b & ~m)) & (m | ( a & ~b & ~m))
|= ((~a | a) & (a | ~b) &( a | ~m)) & (b | ( a & ~b & ~m)) & (m | ( a & ~b & ~m))
|= (T & (a | ~b) &( a | ~m)) & (b | ( a & ~b & ~m)) & (m | ( a & ~b & ~m))
|= ((a | ~b) & (a | ~m)) & (b | ( a & ~b & ~m)) & (m | ( a & ~b & ~m))

.. .. , . - choice,

r = (a & ~m) | (b & m)

! . , , XOR, ? , , and or - 4 (1 or, 2 and, 1 neg), r = a ^ ((a ^ b) & mask) 3 (2 xor, 1 and).

, kmaps? , , , .:) Google . , , - , . ? , , :

| A | B | M || R |
============++====
| X | X | 0 || A |
| X | X | 1 || B |

, 64 ?

| A1| A0| B1| B0| M1| M0|| R1| R0|
========================++========
| X | X | X | X | 0 | 0 || A1| A0|
| X | X | X | X | 0 | 1 || A1| B0|
| X | X | X | X | 1 | 0 || B1| A0|
| X | X | X | X | 1 | 1 || B1| B0|

4 :)

( X " ".) Kmap. , , [.. , ].

, , .

.

+5

. :

a        = 10101110
b        = 01100011
mask     = 11110000

a ^ b    = 10101110
           01100011
           --------
x =>       11001101

x & mask = 11001101
           11110000
           --------
x =>       11000000

a ^ x    = 11000000
           10101110
           --------
x =>       01101110

(final x - r)
, , , , . , .

+7

, , , .

:

http://www.allaboutcircuits.com/vol_4/chpt_7/1.html

.

. , , , , , .

http://www.allaboutcircuits.com/vol_4/chpt_8/1.html
+2

a ^ x x a, x.

a ^ b 1, a b , a 0, .

x (a ^ b) & mask a, a b . , a ^ ((a ^ b) & mask) , , , , a, , b.

0

, . , . - ( 4 ).

, a 0x13, b 0x22, mask 0x0f:

a              : 0x13 : 0001 0011
b              : 0x22 : 0010 0010
---------------------------------
a^b            : 0x31 : 0011 0001
mask           : 0x0f : 0000 1111
---------------------------------
(a^b)&mask     : 0x01 : 0000 0001
a              : 0x13 : 0001 0011
---------------------------------
a^((a^b)&mask) : 0x12 : 0001 0010

a 4 b ( , a b.

, (a & ~mask) | (b & mask):

a              : 0x13 : 0001 0011
~mask          : 0xf0 : 1111 0000
---------------------------------
a & ~mask      : 0x10 : 0001 0000

b              : 0x22 : 0010 0010
mask           : 0x0f : 0000 1111
---------------------------------
b & mask       : 0x20 : 0000 0010

a & ~mask      : 0x10 : 0001 0000
b & mask       : 0x20 : 0000 0010
---------------------------------
(a & ~mask) |  : 0x12 : 0001 0010
   (b & mask)

: , - , . - " ". -, .

0

(&, |, ^, ~) . , . , , - (< <, → ), . x << 3 == x * pow(2,3) x >> 4 == (int)(x * pow(2,-4)).

0

. (a ^ b) & mask. , (a ^ b) & mask . xor'ed , a ^ (a ^ b) & mask a.

1 , (a ^ b) & mask a ^ b. , xor a, a ^ (a ^ b) = (a ^ a) ^ b = b. a ^ a = 0 - xor'ed . , , xor'ed .

:

, , . , , - , , . , , , , , . .

, , . , , , - .

0

( 1-) . ,

a && b = b && a
1 && a = a
1 || a = 1
0 && a = ... //you get the idea. Come up with as many as you can.

"" xor:

1 ^^ b = !b
0 ^^ b = ...

, . , . .

0

, - , , . - - ( ) - ( ddk),

// ntifs.h

// ,

#define FlagOn (_F, _SF) ((_F) (_SF))

#define BooleanFlagOn (F, SF) ((BOOLEAN) (((F) (SF))!= 0))

#define SetFlag (_F, _SF) ((_F) | = (_SF))

#define ClearFlag (_F, _SF) ((_F) & = ~ (_SF))

, , SetFlag (x, y) , . , , , , . , !

0

Source: https://habr.com/ru/post/1722200/


All Articles