سلام

این جلسه می خواهیم با چند عمل گر دیگر آشنا شویم. به عمل گر هایی که در ادامه مشاهده می کنید، عمل گر های بیتی (Bitwise operator) می گویند. یعنی با اعداد به صورت دودویی کار دارند.

اول از همه می خواهیم با عمل گر های shift left و shift right آشنا شویم. این دو عمل گر علاوه بر این که به طور معمول برای cin و cout استفاده می شوند، کاربردهای دیگری هم دارند. عمل گر shift right دو ورودی می گیرد که هر دو عدد هستند؛ این عمل گر عدد دودویی متغیر سمت چپ خود را می گیرد و سپس تمامی ارقام آن را به اندازه ی رقم سمت راست خود به سمت راست حرکت می دهد. مثلا اگر در برنامه ی خود بنویسیم

cout << (6 >> 1) << endl;

خروجی برنامه ی ما ۳ خواهد بود. به عبارت دیگر این عمل گر عدد سمت چپ خود را تقسیم بر ۲ به توان عدد سمت راست خود می کند. برای این که این عمل گر را بهتر متوجّه شوید، به کد زیر یک نگاه بیاندازید.

#include <iostream>

using namespace std;

int main(){
    int a = 32;
    a >>= 2;
    cout << a << endl;
    return 0;
}

کار عمل گر shift left درست مثل عمل گر shift right است با این تفاوت که این عمل گر تمامی ارقام عدد سمت چپ خود را به اندازه ی عدد سمت راست خود به سمت چپ حرکت می دهد یا در واقع عدد را در ۲ به توان عدد سمت راست خود ضرب می کند. استفاده از این عمل گر را نیز می توانید در کد زیر مشاهده نمایید.

#include <iostream>

using namespace std;

int main(){
    int a = 8;
    a <<= 2;
    cout << a << endl;
    return 0;
}

عمل گر تیلدا (tilde): این عمل گر که با نماد ~ شناخته می شود، یک ورودی می گیرد و سپس تمامی بیت های آن را تغییر می دهد. یعنی اگر یک بیت آن ۰ باشد، آن را به ۱ و اگر ۱ باشد، آن را به ۰ تبدیل می کند. کد زیر بیان گر طرز استفاده از این عمل گر است (اگر به ورودی های عجیب و غریب هنگام استفاده از این عمل گر برخورد کردید، نگران نباشید و بدانید که رفتارهای این عمل گر توضیح دارد که توضیح آن در این زمان و مکان نمی گنجد).

#include <iostream>

using namespace std;

int main(){
    int a = 6;
    cout << ~a << endl;
    return 0;
}

عمل گر های & (Bitwise and) و | (Bitwise or): با طرز عمل کرد عمل گر های && و || آشنا هستید. عمل گر های & و | عمل کردی شبیه این عمل گر ها دارند فقط کار مخصوص به خود را با همه ی بیت های متناظر از دو عدد انجام می دهند. یعنی مثلا عمل گر & ابتدا بیت اوّل از عدد اوّل را با بیت دوم از عدد دوم مقایسه می کند. اگر هر دو ۱ باشند، بیت اوّل خروجی را برابر با ۱ قرار می دهد وگرنه بیت اوّل خروجی را برابر با ۰ قرار می دهد. سپس سراغ بیت بعدی می رود.

طرز استفاده از آن ها نیز واضح هست. می توانید در کد زیر عمل کرد آن ها را مشاهده کنید.

#include <iostream>

using namespace std;

int main(){
    int a = 9, b = 5;
    cout << (a & b) << ' ' << (a | b) << endl;
    return 0;
}

عمل گر xor: این عمل گر که با نماد ^ شناخته می شود، مانند دو عمل گر قبلی دو عدد را به عنوان ورودی می گیرد. سپس بیت به بیت آن ها را مقایسه می کند. مثلا در بیت اوّل اگر بیت اوّل یکی از اعداد ۱ باشد و بیت اوّل عدد دیگر ۰، این بیت از خروجی را برابر با ۱ قرار می دهد. وگرنه این بیت را برابر با ۰ قرار می دهد.

در کد زیر از این عمل گر استفاده شده است.

#include <iostream>

using namespace std;

int main(){
    int a = 9, b = 5;
    cout << (a ^ b) << endl;
    return 0;
}

تمرین: عمل گر هایی که این جلسه درس داده شدند را برای Point پیاده سازی کنید (توجّه داشته باشید که این عمل گر ها تنها برای اعداد صحیح تعریف شده اند، پس جزء صحیح اعداد را در نظر بگیرید.).

موفق باشید!