یک عملگر بیتی با عملوندهای خود به عنوان مجموعهای از ۳۲ بیت (صفرها و یکها) رفتار میکند، نه به عنوان یک عدد دهدهی (Decimal)، شانزدهدهی (Hexadecimal) یا هشتدهی (Octal). به عنوان مثال، عدد دهدهی ۹ در نمایش باینری به صورت 1001 نشان داده میشود. عملگرهای بیتی عملیات خود را روی این ساختارهای باینری انجام میدهند، اما در نهایت یک مقدار عددی استاندارد جاوااسکریپت را برمیگردانند.
جدول زیر خلاصهای از عملگرهای بیتی جاوااسکریپت را نشان میدهد:
| عملگر | نحوه استفاده | توصیف کارکرد |
| AND بیتی | a & b | در هر جایگاهی که بیتهای متناظر در هر دو عملوند ۱ باشند، بیت ۱ برمیگرداند. |
| OR بیتی | `a | b` |
| XOR بیتی | a ^ b | اگر بیتهای متناظر مثل هم باشند بیت ۰ و اگر با هم متفاوت باشند بیت ۱ برمیگرداند. |
| NOT بیتی | ~ a | تمام بیتهای عملوند خود را معکوس (وارون) میکند. |
| شیفت به چپ | a << b | نمایش باینری a را به اندازه b بیت به سمت چپ هل میدهد و از سمت راست صفرهای جدید وارد میکند. |
| شیفت به راست با حفظ علامت | a >> b | نمایش باینری a را به اندازه b بیت به سمت راست هل میدهد و بیتهای اضافی که خارج میشوند را دور میریزد. |
| شیفت به راست با تزریق صفر | a >>> b | نمایش باینری a را به اندازه b بیت به سمت راست هل میدهد، بیتهای خارج شده را دور میریزد و از سمت چپ صفر وارد میکند. |
از نظر مفهومی، عملگرهای منطقی بیتی به این صورت کار میکنند:
۱. عملوندها به اعداد صحیح ۳۲ بیتی تبدیل شده و به صورت مجموعهای از بیتها (صفر و یک) بیان میشوند. در اعدادی که بیشتر از ۳۲ بیت دارند، بیتهای باارزشترِ اضافی (سمت چپ) دور ریخته میشوند. برای مثال، عدد صحیح زیر که بیشتر از ۳۲ بیت دارد، به یک عدد ۳۲ بیتی تبدیل میشود:
قبل از تبدیل: 1110 0110 1111 1010 0000 0000 0000 0110 0000 0000 0001
بعد از تبدیل: 1010 0000 0000 0000 0110 0000 0000 0001
۲. تکتک بیتهای عملوند اول با بیتهای متناظر در عملوند دوم جفت میشوند: بیت اول با بیت اول، بیت دوم با بیت دوم و به همین ترتیب.
۳. عملگر روی هر جفت بیت اعمال شده و نتیجه به صورت بیتبهبیت ساخته میشود.
به عنوان مثال، نمایش باینری عدد نه 1001 و عدد پانزده 1111 است. زمانی که عملگرهای بیتی روی این مقادیر اعمال میشوند، نتایج به این صورت خواهد بود:
| عبارت | نتیجه عددی | توصیف باینری عملیات |
15 & 9 | 9 | 1111 & 1001 = 1001 |
| `15 | 9` | 15 |
15 ^ 9 | 6 | 1111 ^ 1001 = 0110 |
~15 | -16 | ~ 0000 0000 … 0000 1111 = 1111 1111 … 1111 0000 |
~9 | -10 | ~ 0000 0000 … 0000 1001 = 1111 1111 … 1111 0110 |
توجه داشته باشید که در عملگر NOT بیتی، تمام ۳۲ بیت معکوس میشوند و مقادیری که بالاترین بیت آنها (چپترین بیت) ۱ باشد، نشاندهندهی اعداد منفی هستند (نمایش مکمل دو یا Two's-complement). عبارت ~x همیشه به همان مقداری ارزیابی میشود که عبارت -x - 1 به آن میرسد.
عملگرهای شیفت بیتی دو عملوند دریافت میکنند: عملوند اول مقداری است که باید شیفت داده شود و عملوند دوم تعداد جایگاههایی (بیتهایی) را مشخص میکند که عملوند اول باید به آن اندازه جابجا شود. جهت این جابجایی توسط نوع عملگر استفاده شده کنترل میشود.
عملگرهای شیفت، عملوندهای خود را به اعداد صحیح ۳۲ بیتی تبدیل میکنند و نتیجهای از نوع Number یا BigInt برمیگردانند؛ به این صورت که اگر نوع عملوند سمت چپ BigInt باشد، خروجی BigInt خواهد بود و در غیر این صورت، Number برمیگردانند.
این عملگرها در جدول زیر آورده شدهاند:
| عملگر | توصیف کارکرد | مثال |
شیفت به چپ (<<) | این عملگر، عملوند اول را به تعداد بیتهای مشخص شده به سمت چپ هل میدهد. بیتهای اضافی که از سمت چپ خارج میشوند دور ریخته شده و بیتهای صفر از سمت راست وارد میشوند. | عبارت 9 << 2 نتیجه ۳۶ را میدهد؛ زیرا 1001 وقتی ۲ بیت به چپ برود تبدیل به 100100 میشود که همان عدد ۳۶ است. |
شیفت به راست با حفظ علامت (>>) | این عملگر، عملوند اول را به تعداد بیتهای مشخص شده به سمت راست هل میدهد. بیتهای اضافی که از سمت راست خارج میشوند دور ریخته شده و کپیهایی از چپترین بیت (بیت علامت) از سمت چپ وارد میشوند. | عبارت 9 >> 2 نتیجه ۲ را میدهد؛ زیرا 1001 وقتی ۲ بیت به راست برود تبدیل به 10 میشود که همان عدد ۲ است. به همین ترتیب، 9 >> 2- نتیجه ۳- را میدهد، چون علامت عدد حفظ میشود. |
شیفت به راست با تزریق صفر (>>>) | این عملگر، عملوند اول را به تعداد بیتهای مشخص شده به سمت راست هل میدهد. بیتهای اضافی از سمت راست دور ریخته شده و بیتهای صفر از سمت چپ وارد میشوند. | عبارت 19 >>> 2 نتیجه ۴ را میدهد؛ زیرا 10011 وقتی ۲ بیت به سمت راست برود تبدیل به 100 میشود که همان عدد ۴ است. برای اعداد غیرمنفی، این عملگر و عملگر شیفت به راست با حفظ علامت، نتیجه کاملاً یکسانی دارند. |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript