عملگرهای بیتی (Bitwise)
اینجا با «عملگرهای بیتی جاوااسکریپت» آشنا می شوی. «بیت (Bit)» کوچک ترین واحد داده است. هر عملگر روی بیت ها کار می کند، نه روی اعشار. پس نتیجه دقیقاً شبیه حساب معمولی نیست.
مرور سریع عملگرهای بیتی
AND هم زمانی را می سنجد؛ OR وجود را؛ XOR تفاوت را؛ NOT برعکس می کند. شیفت ها بیت ها را جابه جا می کنند.
let a = 5 & 1;
let b = 5 | 1;
let c = 5 ^ 1;
let d = ~5;
let e = 5 << 1;
let f = 5 >> 1;
let g = 5 >>> 1;
نکته: جاوااسکریپت اعداد را برای عملیات بیتی به عدد صحیح 32بیتی تبدیل می کند.
AND، OR، XOR و NOT
AND زمانی 1 می شود که هر دو بیت 1 باشند. OR با یکی 1 است. XOR وقتی متفاوت اند 1 می شود. NOT همه بیت ها را برعکس می کند.
let x1 = 5 & 1;
let x2 = 5 | 1;
let x3 = 5 ^ 1;
let x4 = ~5;
هشدار: به خاطر مکمل دوم 32بیتی، ~5 برابر با -6 می شود.
شیفت ها: << ، >> و >>>
شیفت چپ << صفر از راست می آورد. شیفت راست علامت دار >> بیت علامت را نگه می دارد. شیفت راست بدون علامت >>> صفر از چپ می آورد.
let s1 = 5 << 1;
let s2 = -5 >> 1;
let s3 = 5 >>> 1;
عملگرهای انتساب بیتی
ترکیبی ها همان عملگر را اجرا می کنند و در همان متغیر می نویسند.
let y = 10;
y &= 5;
y |= 2;
y ^= 1;
y <<= 1;
y >>= 1;
y >>>= 1;
تبدیل ده دهی و دودویی
برای نمایش باینری از toString(2) کمک بگیر. برای تبدیل باینری به ده دهی از parseInt با مبنا 2 استفاده کن.
function dec2bin(dec) {
return (dec >>> 0).toString(2);
}
function bin2dec(bin) {
return parseInt(bin, 2).toString(10);
}
گام های تمرین
- با & بررسی کن آیا بیت سوم 1 است.
- با | پرچم مخصوص را فعال کن.
- با ^ پرچم را تغییر وضعیت بده.
نکته: برای مفاهیم عددی، صفحه مرجع عدد و برای مقادیر خیلی بزرگ، BigInt را ببین.
جمع بندی سریع
- عملیات بیتی روی 32 بیت انجام می شود.
- ~x در مکمل دوم نتیجه منفی می دهد.
- << ضرب در توان دو است.
- >> علامت را حفظ می کند.
- >>> همیشه صفر از چپ می آورد.