& : عملگر and
اگر ۲ بیت هر ۲ یک باشند جواب هم ۱ میشه در غیر این صورت ۰
15&7
1 1 1 1 // 15
0 1 1 1 // 7
------------
0 1 1 1 // 7
| : عمگر or
اگر هر کدوم از بیت ها ۱ باشن جواب هم ۱ میشه در غیر این صورت ۰
4|3
0 1 0 0 // 4
0 0 1 1 // 3
----------
0 1 1 1 // 7
~ : عملگر not
بیت ۱ به ۰ تبدیل میشه و ۰ به ۱
~8
1 0 0 0 // 8
---------------
0 1 1 1 // 7
^ : عملگر xor
اگر ۲ بیت مثل هم باشن جواب ۰ میشه در غیر این صورت ۱
14^9
1 1 1 0 // 14
1 0 0 1 // 9
-----------
0 1 1 1 // 7
>>: عملگر left shift
تمام بیت ها رو به چپ شیفیت می کنه مثلا
3<<2
0 0 1 1 // 3
---------
1 1 0 0 // 12
<< : علگر right shift
برعکس >> همه بیت ها رو به راست شیفت می کنه :
10>>2
1 0 1 0 // 10
----------
0 0 1 0 // 2
دقت داشته باشین که << , >> که در cin , cout استفاده میشن کاملا با این عملگر ها فرق دارن اون عملگر ها اصطلاحا overload شدن و معنی جدیدی پیدا کردن .
و این که عملگر های زیر هم با هم معادل هستن :
a &=3 va a = a&3
a |=3 va a = a|3
a <<=3 va a = a<<3
va..........
کاربرد ها :
مصرف بهینه حافظه : توی برنامه نویسی بزرگترین مقدار حافظه ای که می تونین بهش دسترسی داشته از نوع بایت هست ولی با استفاده از این عملگر ها می تونین از هر ۸ بیت موجود در بایت استفاده کنین . مثلا می تونین ۸ تا متغیر از نوع bool رو داخل یک متغیر از نوع char ذخیره کنین .
مثال :
#include <iostream>
using namespace std;
class BoolContainer
{
public:
BoolContainer ():
var(0)
{}
bool operator [](int index)
{
if(index>7)
throw "Wrong index";
return var & (1<<index);//var & pow(2,index)
}
void setCondition(int index,bool condition)
{
if(index>7)
throw "Wrong index";
if(condition)
{
var |= 1<<index;
}
else
{
var &= !(1<<index);
}
}
private:
unsigned char var;
};
int main()
{
BoolContainer container;
//test
container.setCondition(0,true);
cout<<container[0]<<endl;
container.setCondition(1,true);
cout<<container[1]<<endl;
container.setCondition(1,false);
cout<<container[1]<<endl;
cout<<container[5]<<endl;
container.setCondition(5,true);
cout<<container[5];
//
}
برای دیدن کاربرد های بیشتر می تونین به این لینک مراجعه کنین :
http://graphics.stanford.edu/~seander/bithacks.html