Амалиётҳои битӣ - Course 1
Амалиётҳои битӣ Амалиётҳои битӣ
Муқаддима
Амалиётҳои битӣ мустақиман бо намоиши дуии ададҳои бутун кор мекунанд.
Оператор Рамз Мисол Маъно Ҷойивазкунии чапи битӣ <<x << kҲамаи битҳои x-ро ба чап ба андозаи k мавқеъ ҷойиваз мекунад Ҷойивазкунии рости битӣ >>x >> kҲамаи битҳои x-ро ба рост ба андозаи k мавқеъ ҷойиваз мекунад AND-и битӣ &x & yAND-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунад OR-и битӣ |x | yOR-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунад OR-и истисноии битӣ ^
XOR-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунад
Ҷойивазкунии чапи битӣ ( a n − 1 a n − 2 … a 1 a 0 ) 2 (a_{n-1}a_{n-2}\ldots a_1a_0)_2 ( a n − 1 a n − 2 … a 1 a 0 ) 2 ба чап ба андозаи k k k мавқеъ ҷойиваз мекунем, мо ба рост k k k сифрро замима мекунем:
( a n − 1 a n − 2 … a 1 a 0 00 … 0 ) 2 (a_{n-1}a_{n-2}\ldots a_1a_0 00\ldots0)_2 ( a n − 1 a n − 2 … a 1 a 0 00 … 0 ) 2 Пас, ҷойивазкунӣ ба чап ба як мавқеъ ба зарб кардан ба 2 2 2 баробар аст, ва ҷойивазкунӣ ба чап ба k k k мавқеъ ба зарб кардан ба 2 k 2^k 2 k баробар аст.
Ҷойивазкунии рости битӣ ( a n − 1 a n − 2 … a 1 a 0 ) 2 (a_{n-1}a_{n-2}\ldots a_1a_0)_2 ( a n − 1 a n − 2 … a 1 a 0 ) 2 ба рост ба андозаи k k k мавқеъ ҷойиваз мекунем, k k k битҳои охирин хориҷ карда мешаванд:
( a n − 1 a n − 2 … a k ) 2 (a_{n-1}a_{n-2}\ldots a_k)_2 ( a n − 1 a n − 2 … a k ) 2 Барои ададҳои ғайриманфӣ, ҷойивазкунӣ ба рост ба як мавқеъ ба тақсимкунии бутун ба 2 2 2 баробар аст, ва ҷойивазкунӣ ба рост ба k k k мавқеъ ба тақсимкунии бутун ба 2 k 2^k 2 k баробар аст.
AND-и битӣ AND-и битии ду адад ( a ) 2 (a)_2 ( a ) 2 ва ( b ) 2 (b)_2 ( b ) 2 ададе ( c ) 2 (c)_2 ( c ) 2 аст, ки дар он
c i = a i & b i c_i = a_i \mathbin{\&} b_i c i = a i & b i Ин маънои онро дорад, ки мо AND-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунем.
Натиҷаи x & y танҳо дар он сурат 1 мешавад, ки ҳар ду бит 1 бошанд. Дар акси ҳол, он 0 аст.
Ҷадвали AND
OR-и битӣ OR-и битии ду адад ( a ) 2 (a)_2 ( a ) 2 ва ( b ) 2 (b)_2 ( b ) 2 ададе ( c ) 2 (c)_2 ( c ) 2 аст, ки дар он
c i = a i ∣ b i c_i = a_i \mathbin{|} b_i c i = a i ∣ b i Ин маънои онро дорад, ки мо OR-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунем.
Натиҷаи x | y дар он сурат 1 мешавад, ки ҳадди ақал яке аз битҳо 1 бошад. Дар акси ҳол, он 0 аст.
Ҷадвали OR
OR-и истисноии битӣ (XOR) XOR-и битии ду адад ( a ) 2 (a)_2 ( a ) 2 ва ( b ) 2 (b)_2 ( b ) 2 ададе ( c ) 2 (c)_2 ( c ) 2 аст, ки дар он
c i = a i ⊕ b i c_i = a_i \mathbin{\oplus} b_i c i = a i ⊕ b i Ин маънои онро дорад, ки мо XOR-ро ба ҳар ҷуфти битҳои мувофиқ татбиқ мекунем.
Натиҷаи x ^ y дар он сурат 1 мешавад, ки дақиқ якто аз битҳо 1 бошад. Агар ҳар ду бит якхела бошанд, натиҷа 0 аст.
Ҷадвали XOR
Масъалаҳои намунавӣ Кӯшиш кунед, ки ин масъалаҳоро худатон ҳал кунед, пеш аз он ки ба ҳалли онҳо нигоҳ кунед.
Намунае 1 Ду адади бутун x x x ( 0 ≤ x ≤ 29 ) (0 \leq x \leq 29) ( 0 ≤ x ≤ 29 ) ва y y y ( 0 ≤ y ≤ 29 ) (0 \leq y \leq 29) ( 0 ≤ y ≤ 29 ) дода шудаанд, ки дар он x ≠ y x \neq y x = y , қимати зеринро бароред
Намунае 2 Ду адади бутун x x x ( 0 ≤ x ≤ 2 29 ) (0 \leq x \leq 2^{29}) ( 0 ≤ x ≤ 2 29 ) ва k k k ( 0 ≤ k ≤ 29 ) (0 \leq k \leq 29) ( 0 ≤ k ≤ 29 ) дода шудаанд, ададеро бароред, ки аз x x x пас аз баръакс кардани битаи k k k -ум ҳосил мешавад.
Намунае 3 Ду адади бутун x x x ( 0 ≤ x ≤ 2 29 ) (0 \leq x \leq 2^{29}) ( 0 ≤ x ≤ 2 29 ) ва k k k ( 0 ≤ k ≤ 29 ) (0 \leq k \leq 29) ( 0 ≤ k ≤ 29 ) дода шудаанд, ададеро бароред, ки аз x x x пас аз гузоштани битаи k k k -ум ба 0 ҳосил мешавад.
Намунае 4 Ду адади бутун x x x ( 0 ≤ x ≤ 2 29 ) (0 \leq x \leq 2^{29}) ( 0 ≤ x ≤ 2 29 ) ва k k k ( 0 ≤ k ≤ 29 ) (0 \leq k \leq 29) ( 0 ≤ k ≤ 29 ) дода шудаанд, қимати битаи k k k -уми адади x x x -ро бароред.
Намунае 5 Ду адади бутун x x x ( 0 ≤ x ≤ 2 29 ) (0 \leq x \leq 2^{29}) ( 0 ≤ x ≤ 2 29 ) ва k k k ( 0 ≤ k ≤ 29 ) (0 \leq k \leq 29) ( 0 ≤ k ≤ 29 ) дода шудаанд, k k k битҳои охирини адади x x x -ро ба 0 гузоред ва натиҷаро бароред.
Намунае 6 Ду адади бутун x x x ( 0 ≤ x ≤ 10 9 ) (0 \leq x \leq 10^9) ( 0 ≤ x ≤ 1 0 9 ) ва y y y ( 0 ≤ y ≤ 10 9 ) (0 \leq y \leq 10^9) ( 0 ≤ y ≤ 1 0 9 ) дода шудаанд, ҳосили зарби онҳоро бе истифодаи амалиётҳои *, /, ё % ҳисоб кунед.
Ҳалҳои намунаҳо
Намунае 1 Барои гирифтани 2 x 2^x 2 x , мо метавонем 1 << x-ро истифода барем. Ба ҳамин монанд, 1 << y қимати 2 y 2^y 2 y -ро медиҳад.
Азбаски x ≠ y x \neq y x = y , ин ду адад битҳои ягонаи гуногунро фаъол доранд, бинобар ин мо метавонем онҳоро бо OR-и битӣ якҷо кунем.
Намунае 2 Барои баръакс кардани битаи k k k -ум, мо XOR-ро бо ниқобе истифода мебарем, ки танҳо битаи k k k -умаш 1 аст.
Намунае 3 Барои гузоштани битаи k k k -ум ба 0, мо метавонем аввал санҷем, ки он 1 ҳаст ё не. Агар бошад, мо онро бармегардонем.
Намунае 4 Барои гирифтани қимати битаи k k k -ум, мо онро ба мавқеи охирин ҷойиваз мекунем ва битаи охиринро мегирем.
Намунае 5 Мо k k k битҳои охиринро як ба як месанҷем ва агар лозим бошад, онҳоро тоза мекунем.
Мо ададро ба рост ба андозаи k k k бит ҷойиваз мекунем, ки k k k битҳои охиринро хориҷ мекунад, ва баъд онро боз ба чап ба андозаи k k k бит ҷойиваз мекунем.
Намунае 6 Мо метавонем намоиши дуии y y y -ро истифода барем.
Агар битаи i i i -уми y y y 1 бошад, пас мо x ⋅ 2 i x \cdot 2^i x ⋅ 2 i -ро ҷамъ мекунем, ки ҳамон x << i аст.
int x = 11 ; // x = 1011 in binary
cout < < ( x < < 2 ) < < " \n " ; // 101100 in binary
int x = 11 ; // x = 1011 in binary
cout < < ( x > > 2 ) < < " \n " ; // 10 in binary
int x = 11 ; // x = 1011
int y = 6 ; // y = 0110
cout < < ( x & y ) < < " \n " ; // 0010 in binary
int x = 9 ; // x = 1001
int y = 4 ; // y = 0100
cout < < ( x | y ) < < " \n " ; // 1101 in binary
int x = 12 ; // x = 1100
int y = 6 ; // y = 0110
cout < < ( x ^ y ) < < " \n " ; // 1010 in binary
cout < < ( ( 1 < < x ) | ( 1 < < y ) ) < < " \n " ;
cout < < ( x ^ ( 1 < < k ) ) < < " \n " ;
if ( x & ( 1 < < k ) ) {
x ^= ( 1 < < k ) ;
}
cout < < x < < " \n " ;
cout < < ( x & ( ~ ( 1 < < k ) ) ) < < " \n " ;
cout < < ( ( x > > k ) & 1 ) < < " \n " ;
for ( int i = 0 ; i < k ; i ++ ) {
if ( x & ( 1 < < i ) ) {
x ^= ( 1 < < i ) ;
}
}
cout < < x < < " \n " ;
cout < < ( ( x > > k ) < < k ) < < " \n " ;
long long res = 0 ;
for ( int i = 0 ; i < 30 ; i ++ ) {
if ( y & ( 1 < < i ) ) {
res += ( 1 LL * x < < i ) ;
}
}
cout < < res < < " \n " ;