17-bo'lim: Bit operatsiyalari¶
π’ Bit darajasidagi amallar β tez (O(1)) va xotira-tejamkor. Tillar farqi: JS bit amallari 32-bitli ishorali butun songa aylantiriladi (kattaroq sonlar uchun
BigInt), PHP ints β 64-bit, Python ints β cheksiz aniqlikda. Belgilar:&(AND),|(OR),^(XOR),~(NOT),<</>>(siljish).
183. Juft/toq β bit bilan¶
β± O(1)
Oxirgi bit 0 bo'lsa juft. n % 2 dan tezroq (garchi zamonaviy kompilyatorlar farqni tekislasa ham).
JS
PHP Python184. k-bitni olish (get bit)¶
β± O(1) β o'ngdan 0-indeksli; 0 yoki 1 qaytaradi.
JS
PHP Python185. k-bitni o'rnatish (set bit β 1)¶
β± O(1)
JS
PHP Python186. k-bitni tozalash (clear bit β 0)¶
β± O(1)
JS
PHP Python187. k-bitni almashtirish (toggle bit)¶
β± O(1)
JS
PHP PythonYuqoridagi to'rt amal bitta umumiy g'oyaga asoslanadi β niqob (1 << k) faqat k-bitni ajratadi, so'ng OR/AND/XOR uni boshqaradi:
188. 2 ning darajasimi (power of two)¶
β± O(1)
2 ning darajasi ikkilik shaklda faqat bitta 1 bit (mas. 1000); nβ1 esa pastki barcha bitlarni 1 qiladi (0111) β AND = 0.
JS
PHP Python189. O'rnatilgan bitlar soni (Brian Kernighan)¶
β± O(o'rnatilgan bitlar soni) Β· πΎ O(1)
n &= n β 1 har safar eng past 1 bitni o'chiradi β sikl 32 emas, bitlar soniga teng aylanadi. Pythonda bin(n).count("1") ham bor.
JS
PHP Python190. Eng past o'rnatilgan bitni ajratish (n & βn)¶
β± O(1)
Ikkitalik to'ldiruvchi (two's complement) tufayli βn eng past 1 bitdan boshqa hammasini teskari qiladi; AND faqat o'sha bitni qoldiradi (12 = 1100 β 4 = 0100). Fenwick tree (BIT) da ishlatiladi.
JS
PHP Python191. XOR bilan swap (temp'siz)¶
β± O(1)
a ^ b ^ b = a xossasiga asoslangan. Amaliyotda o'qilishi uchun oddiy almashtirish (a, b = b, a) afzal β bu shunchaki bit mantiqiga misol.
JS
PHP Python192. Yagona sonni topish (single number)¶
β± O(n) Β· πΎ O(1)
Hamma element ikki marta, faqat bittasi bir marta. x^x=0, x^0=x β juftlar o'zaro yo'qoladi, yagona qoladi.
JS
PHP Pythonfrom functools import reduce
import operator
def single_number(nums):
return reduce(operator.xor, nums, 0)
193. Bitlarni teskari ag'darish (32-bit)¶
β± O(1) (32 iteratsiya)
JS'da >>> ishorasiz siljish, >>> 0 esa natijani ishorasiz 32-bit qiladi (JS bit amallari 32-bit ishorali bilan ishlaydi). PHP/Python butun sonlari kengroq.
JS
const reverseBits = n => {
let result = 0;
for (let i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>>= 1;
}
return result >>> 0;
};
function reverseBits($n) {
$result = 0;
for ($i = 0; $i < 32; $i++) {
$result = ($result << 1) | ($n & 1);
$n >>= 1;
}
return $result;
}
def reverse_bits(n):
result = 0
for _ in range(32):
result = (result << 1) | (n & 1)
n >>= 1
return result