عملگرهای شیفت بیتی در آردوینو:
شیفت چپ (>>) ، شیفت راست (<<)
دو عملگر شیفت بیتی در آردوینو وجود دارد: عملگر شیفت چپ >> و عملگر شیفت راست <<. این عملگرها باعث میشوند که بیتهای عملوند سمت چپ، به تعدادی که در عملوند سمت راست مشخص شده است، به سمت چپ یا راست شیفت داده شوند. (جابهجا شوند.)
سینتکس (نحو):
تعداد بیت >> متغیر : شیفت جپ
تعداد بیت << متغیر : شیفت راست
پارامترها:
متغیر: (از نوعهای byte ، int، long)
تعداد بیت: عدد صحیح <= 32
مثال:
1 2 3 4 5 6 7 8 | int a = 5; // binary: 0000000000000101 int b = a << 3; // binary: 0000000000101000, or 40 in decimal int c = b >> 3; // binary: 0000000000000101, or back to 5 like we started with // ابتدا متغیری از نوع صحیح با مقدار پنج تعریف کردهایم. // سپس در خط دوم آن را سه بیت به سمت چپ شیفت دادهایم. حاصل این عمل در متغیر // بی ریخته شده و در حال حاضر بی حاوی مقدار چهل دهدهی است. // در انتها بی را سه بیت به سمت راست شیفت دادهایم. که عکس عمل بالا است. و // در واقع سی حاوی مقدار پنج اولیه است. |
هنگامیکه شما مقدار X را به تعداد Y بیت (x << y) شیفت میدهید، Y بیت از چپترین بیتهای X گم میشوند؛ درواقع از موجودیت خارج میشوند.
1 2 3 4 | int a = 5; // binary: 0000000000000101 int b = a << 14; // binary: 0100000000000000 - the first 1 in 101 was discarded // اولین عدد یک از بین رفته است. |
عملیات شیفت به چپ درواقع مقدار را در 2 به توان تعداد بیت ضرب میکند: X*Y^2 .
برای مثال، شیفت چپ عدد 10 به تعداد 2 بیت، 40 میشود. یعنی 10*2^2=40
مثال:برای ایجاد توانهایی از 2، این عبارات مفید هستند:
1 2 3 4 5 6 7 8 9 | 1 << 0 == 1 1 << 1 == 2 1 << 2 == 4 1 << 3 == 8 ... 1 << 8 == 256 1 << 9 == 512 1 << 10 == 1024 ... |
هنگامیکه شما مقدار X را به تعداد Y بیت (x >> y) شیفت راست میدهید و بالاترین بیت X عدد 1 است، رفتار عملیات به نوع دادهی دقیق X بستگی دارد. اگر X از نوع int باشد، بالاترین بیت، بیت علامت است که همانطور که در بالا گفتیم، مشخص میکند که آیا X منفی است یا نه. در چنین موقعیتی، به دلایلی مبهم، بیت علامت به بیتهای پایینتر کپی میشود:
1 2 | int x = -16; // binary: 1111111111110000 int y = x >> 3; // binary: 1111111111111110 |
این رفتار که به آن توسعه علامت گویند، معمولا رفتار دلخواه ما نیست؛ ما احتمالا میخواهیم که از سمت چپ، صفر وارد شود. به نظر میرسد که قوانین شیفت به راست در عبارات صحیح بدون علامت، متفاوت است؛ پس میتوانید از typecast (عمل تغییر نوع داده) برای متوقت کردن کپی از سمت چپ استفاده کنید:
1 2 | int x = -16; // binary: 1111111111110000 int y = (unsigned int)x >> 3; // binary: 0001111111111110 |
اگر مراقب عمل توسعه علامت باشید میتوانید از عملگر شیفت به راست، به عنوان راهی برای تقسیم مقدار به توانهای 2، استفاده کنید. برای مثال:
1 2 3 4 | int x = 1000; int y = x >> 3; // integer division of 1000 by 8, causing y = 125. //عدد هزار به دو به توان سه (=هشت) تقسیم میشود. حاصل متغیر وای، صد و // بیست و پنج است. |
پس عملیات شیفت به راست، در واقع مقدار را به 2 به توان تعداد بیت، تقسیم میکند:
برای مثال شیفت راست عدد 40 به تعداد 2 بیت، 40 میشود. یعنی 40/ (2^2)=10