VC中怎么改变二进制数指定位置的数?

一、位操作运算符简介

    这部分跟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

}

上一篇:VC的使用


下一篇:WebRTC对你意味着什么