一、位操作运算符简介
这部分跟C++的位操作运算符有关,它们运算的基础是二进制数。因此,这就要将一个整数变为二进制数,才进行位运算。
这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char、short、int 与 long 类型。
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
注意二进制数的最低位在最右端,而字符串的索引0在最左端。如11010,若你用CString来提取某个位置的字符时,0位置的字符为1;若将二进制数转换为十进制数时,最低0次幂在最右端。
这部分跟C++的位操作运算符有关,共有 6 种位运算符,参考如下:
1、&(按位与)
该运算是指将参加运算的两个整数a和b,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
运算规律:两位同时为1,结果才为1,否则为0。
例如:3&5,则011 & 101 = 001, 因此,3&5的值为1。
2、| (按位或)
该运算是指将参加运算的两个整数a和b,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
运算规律:对应位只要有一个为1,其值为1,否则为0。
例如:3|5,则011 | 101 = 111, 因此,3|5的值为7。
3、^ (按位异或)
该运算是指将参加运算的两个整数a和b,按二进制位进行“异或”运算。
运算规则:0 ^ 0=0; 0 ^ 1=1; 1^ 0=1; 1^1=0;
运算规律:对应位的数不同,其值为1,否则为0。
例如:3^ 5,则011 ^ 101 = 110, 因此,3 ^ 5的值为6。
4、~ (取反)
该运算是指将整数的各个二进制位都取反,即1变为0,0变为1。
例如,~9=-10,因为9(00001001)所有位取反即为(11110110),这个数最高位是1,所以是补码。补码还原成反码(反码等于补码减1)得到(11110101),再还原为原码(反码到原码最高位不变,其它各位取反)等于(10001010), 十进制为-10。
5、<< (左移)
该运算是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值);高位左移溢出则舍弃该位,其右边空出的位用0填补。
例如:143<<2,143转换为进制为10001111,左移2得00111100 ,结果为60。
6、>> (右移)
该运算是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值);低位右移溢出则舍弃该位,高位的规则与数的类型有关。
即对于无符号数,高位补0;对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
例如:60>>2,60转换为进制为00111100,右移2得0000 1111 ,结果为15。
二、改变整数的指定位二进制数的步骤
为了方便,假设某个整数A为例。
1、 定位指定位的方法
利用<<运算符,将1左移若干位。
你要提取0位,则为1<<0
你要提取1位,则为1<<1
你要提取2位,则为1<<2
……
2、 利用&获取整数指定位的数
A & (1<<0)可以提取到0位置的数(要么是0,要么是1)
A & (1<<1)可以提取到1位置的数
A & (1<<2)可以提取到2位置的数
……
3、 改变特定位的数
(1)、若指定位的数为0,则要变为1,这个要利用“|”操作符。参考如下:
A|=1<<0,将0位变为1
A|=1<<1,将1位变为1
A|=1<<2,将2位变为1
……
(2)、若特定位的数为1,则要变为0,这个要利用“^”操作符。参考如下:
A^=1<<0,将0位变为0
A^=1<<1,将1位变为0
A^=1<<2,将2位变为0
……
三、示例参考
//改变二进制0位置的数
void CSample1Dlg::OnBnClickedButton1()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<0);
if(bitState == 0)
{
iVal|=1<<0;
}
else
{
iVal^=1<<0;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为101011
}
//改变二进制1位置的数
void CSample1Dlg::OnBnClickedButton2()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<1);
if(bitState == 0)
{
iVal|=1<<1;
}
else
{
iVal^=1<<1;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为101000
}
//改变二进制2位置的数
void CSample1Dlg::OnBnClickedButton3()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<2);
if(bitState == 0)
{
iVal|=1<<2;
}
else
{
iVal^=1<<2;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为101110
}
//改变二进制3位置的数
void CSample1Dlg::OnBnClickedButton4()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<3);
if(bitState == 0)
{
iVal|=1<<3;
}
else
{
iVal^=1<<3;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为100010
}
//改变二进制4位置的数
void CSample1Dlg::OnBnClickedButton5()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<4);
if(bitState == 0)
{
iVal|=1<<4;
}
else
{
iVal^=1<<4;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为111010
}
//改变二进制5位置的数
void CSample1Dlg::OnBnClickedButton6()
{
int iVal = 42;//二进制为101010
int bitState = iVal & (1<<5);
if(bitState == 0)
{
iVal|=1<<5;
}
else
{
iVal^=1<<5;
}
CString strRes;
char sRes[16];
_itoa(iVal,sRes,2);//十进制变为二进制
strRes.Format("%s",sRes);
MessageBox(strRes);//结果为001010
}