اپراتورهای بیتی برای استفاده راحت هستند و می توانند باعث ایجاد کد سریع تاول زده شوند. دریابید که آنها چیست و چگونه از آنها استفاده کنید.
عملگرهای بیتی آنهایی هستند که در سطح باینری عمل می کنند. آنها اغلب بسیار سریع اجرا می شوند و معمولاً روی دو عملوند عمل می کنند.
شما می توانید از عملگرهای بیتی برای دستکاری اعداد باینری، بهینه سازی کد، فشرده سازی داده ها و پیاده سازی تکنیک هایی برای گرافیک یا برنامه نویسی بازی استفاده کنید. مانند بسیاری از زبان های برنامه نویسی دیگر، جاوا اسکریپت از عملیات بیتی پشتیبانی عالی دارد.
اپراتورها چیست؟
بیشتر زبان های برنامه نویسی از مفهوم “اپراتور” استفاده می کنند – نمادی که به مفسر می گوید یک عملیات ریاضی، رابطه ای یا منطقی خاص را انجام دهد.
انواع مختلفی از عملگرهای جاوا اسکریپت وجود دارد که باید از آنها آگاه باشید، از آنهایی که شبیه عملگرهای ریاضی استاندارد هستند، مانند “+” تا عملگرهایی که دو مقدار را با هم مقایسه می کنند. عملگرهای بیتی مجموعه خاصی هستند که با اعداد باینری سروکار دارند.
عملگر بیتی AND (&).
عملگر جاوا اسکریپت بیتی AND (&) بیت های متناظر دو عملوند باینری را مقایسه می کند – اعدادی که فقط شامل 0 و 1 هستند. برای هر جفت بیت ورودی، اگر هر دو بیت ورودی “1” یا “” باشند، بیت خروجی مربوطه “1” است. 0” در غیر این صورت.
در اینجا نحو عملگر بیتی AND آمده است:
a & b
در این مثال، a و b عملوندهایی هستند که بر روی آنها عملیات بیتی را انجام می دهید.
در اینجا نحوه عملکرد عملگر بیتی AND آمده است:
- عملیات AND برای هر جفت بیت متناظر در a و b از راست به چپ اعمال می شود.
- اگر هر دو بیت 1 باشند، نتیجه 1 است. اگر هر بیت 0 باشد، نتیجه 0 خواهد بود.
- نتیجه یک عدد جدید است که در آن هر بیت نتیجه عملیات AND روی بیت های مربوطه a و b را نشان می دهد.
مثلا:
let a = 50; // 00110010
let b = 100; // 01100100
let result = a & b; // 00100000
console.log(result); // 32
در مثال بالا، a در اعشار 50 است، معادل عدد باینری 00110010، و b در اعشار 100 است، معادل عدد باینری 01100100. عملگر AND هر جفت بیت متناظر را از راست به چپ مقایسه می کند و باینری حاصل را تولید می کند. عدد 00100000 که عدد 32 در اعشار است.
عملگر بیتی OR (|).
عملگر بیتی OR (|) بیت های متناظر دو عملوند را مقایسه می کند و اگر یکی یا هر دو بیت “1” باشند “1” و اگر هر دو بیت “0” باشند “0” را برمی گرداند.
در اینجا نحو عملگر بیتی OR آمده است:
a | b
جایی که a و b عملوندهای عملیات هستند.
عملگر بیتی OR (|) مانند عملگر بیتی AND کار می کند. تنها تفاوت این است که اپراتور OR “1” را برمی گرداند اگر “هر کدام” از بیت ها “1” باشد و “0” اگر “هر دو” بیت “0” باشد.
مثلا:
let a = 50; // 00110010
let b = 100; // 01100100
let result = a | b; // 01110110
console.log(result); // 118
در مثال بالا، عملگر بیتی OR هر جفت بیت را از راست به چپ مقایسه می کند (یعنی 0 | 0 = 0، 0 | 1 = 1، 1 | 1 = 1، و غیره). عدد باینری حاصل 01110110 است که در اعشار 118 است.
عملگر بیتی XOR (^).
عملگر بیتی XOR (^) بیت های متناظر دو عملوند را مقایسه می کند و اگر هر دو عملوند “1” باشد اما هر دو عملوند “1” نباشد “1” و اگر هر دو عملوند “1” یا “0” باشد “0” را برمی گرداند.
در اینجا نحو عملگر بیتی XOR آمده است:
a ^ b
جایی که a و b عملوندهای عملیات هستند.
عملگر بیتی XOR مانند عملگرهای بیتی OR و AND کار می کند. تنها تفاوت این است که اگر “هردو اما نه هر دو” از عملوندها “1” باشد “1” را برمی گرداند و اگر “هر دو” عملوند “1” یا “0” باشد “0”.
مثلا:
let a = 50; // 00110010
let b = 100; // 01100100
let result = a ^ b; // 01010110
console.log(result); // 86
در مثال بالا، عملگر XOR هر جفت بیت را از راست به چپ مقایسه می کند (یعنی 0 ^ 0 = 0، 0 ^ 1 = 1، 1 ^ 1 = 0، و غیره). عدد باینری حاصل 01010110 است که در اعشار 86 است.
عملگر NOT (~) بیتی
عملگر Bitwise NOT (~) یک عملگر یوناری است که بر روی یک عدد صحیح با معکوس کردن تمام بیت های آن عمل می کند. به عبارت دیگر، هر بیت “0” را به “1” و هر بیت “1” را به “0” تغییر می دهد.
در اینجا نحو عملگر bitwise NOT آمده است:
~c
جایی که c عملوند است.
عملگر Bitwise NOT با معکوس کردن تمام بیت های یک عملوند، از جمله بیت های علامت، کار می کند.
مثلا:
let c = 10; // 00001010
let d = -10; // 11110110
console.log(~c); // 11110101
console.log(~d); // 00001001
در مثال بالا، عملگر NOT همه بیت ها (یعنی 0 → 1، 1 → 0، و غیره)، از جمله بیت های علامت را معکوس می کند.
عملگر Shift چپ (<<).
عملگر شیفت چپ، بیت های یک عدد معین را به چپ منتقل می کند. اپراتور دو عملوند را می گیرد: عددی که باید تغییر کند و تعداد بیت هایی که باید آن را جابجا کرد.
در اینجا دستور عملگر شیفت چپ آمده است:
a << b
که در آن a عملوند برای عملگر شیفت چپ است و b تعداد بیت هایی است که عملگر عملوند را با آن جابجا می کند.
عملگر شیفت چپ به این صورت کار می کند که هر بیت از یک عملوند را با تعداد موقعیت های مشخص شده به سمت چپ جابجا می کند و بیت های اضافی را که به سمت چپ منتقل می شوند دور می اندازد.
مثلا:
let a = 50; // 00110010
let b = 2;
let result = a << b; // 11001000
console.log(result); // 200
در مثال بالا، عملگر shift سمت چپ اعشاری 50 00110010 باینری را دو مکان جابجا کرد. مقدار باینری حاصل 11001000 است که اعشار آن 200 است.
عملگر Sign-Propagating Right Shift (>>).
شیفت راست انتشار دهنده علامت (>>) بیت های یک عدد را به سمت راست تغییر می دهد در حالی که علامت عدد اصلی را حفظ می کند. اپراتور دو عملوند را می گیرد: عددی که باید تغییر کند و تعداد بیت هایی که باید آن را جابجا کرد.
در اینجا دستور عملگر شیفت سمت راست در حال انتشار علامت است:
a >> b
در جایی که a عملوند برای عملگر شیفت سمت راست است و b تعداد بیت هایی است که عملگر عملوند را با آن جابجا می کند.
عملگر شیفت راست منتشر کننده علامت مشابه عملگر شیفت چپ کار می کند. تنها تفاوت در نحوه عملکرد این است که شیفت سمت راست علامت را حفظ می کند.
مثلا:
let a = -50; // 11001110
let b = 2;
let result = a >> b; // 11110011
console.log(result); // -13
در مثال بالا، عملگر شیفت راست اعشاری -50 (11001110) را دو فاصله به سمت راست تغییر داد که نتیجه آن عدد 13- (11110011) شد.
عملگر بدون امضا به راست Shift (>>>).
عملگر بدون علامت سمت راست (>>>) بیت های یک عدد را با تعداد مشخصی از موقعیت ها به سمت راست منتقل می کند و فضاهای خالی سمت چپ را با صفر پر می کند. اپراتور بیت های اضافی را که به سمت راست منتقل می کند دور می اندازد.
در اینجا دستور عملگر بدون علامت تغییر سمت راست آمده است:
a >>> b
در جایی که a عملوند برای عملگر شیفت سمت راست است و b تعداد بیت هایی است که عملگر عملوند را با آن جابجا می کند.
عملگر شیفت راست بدون علامت مشابه شیفت راست کار می کند. با این حال، بر خلاف عملگر شیفت سمت راست (>>)، علامت یک عدد را هنگام جابجایی حفظ نمی کند. در عوض، عدد را به عنوان یک عدد صحیح بدون علامت در نظر می گیرد و سمت چپ ترین بیت را با صفر پر می کند.
مثلا:
let a = -5; // 11111111 11111111 11111111 11111011
let b = 2;
let result = a >>> b; // 00111111 11111111 11111111 11111110
console.log(result); // 1073741822
در این مثال، عملگر بدون علامت تغییر سمت راست، دو فاصله “-5” را به سمت راست منتقل کرد، به طور موثر علامت را حذف کرد و به عدد اعشاری “1073741822” منجر شد.
برنامه های کاربردی اپراتورهای Bitwise
با دستکاری تک تک بیت ها در اعداد باینری، عملگرهای بیتی می توانند عملکرد پیچیده ای ایجاد کنند که در غیر این صورت دستیابی به آن با عملیات حسابی سنتی دشوار یا غیرممکن است.
درک نحوه استفاده از عملگرهای بیتی می تواند به شما در ساخت برنامه های کاربردی وب کارآمدتر و کارآمدتر کمک کند.