在学习TCPL2.9时遇到了问题,认真学习一哈位运算符
参考文章
【老九学堂】【C++】位运算符
& //按位与(AND)
| //按位或(OR)
~ //按位非
^ //按位异或(XOR)
>> //右移
<< //左移
>>> //无符号右移
1.按位与运算符( & )
对参与运算的两个数据,按二进制位进行与运算,相应的二进制位如果都为1,返回1;否则为0.
例子
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
int a ;
a = (3 & 5);
cout << a << endl;
system("pause");
return 0 ;
}
0 | 0 | 1 | 1 | 3 |
---|---|---|---|---|
0 | 1 | 0 | 1 | 5 |
0 | 0 | 0 | 1 | 1 |
a与b为真,结果为真
按位与的用途( & )
1.1 清零
将一个数a清零,可用b于a进行按位与
int a ;
a = (3 & 4);
cout << a << endl;
system("pause");
return 0 ;
3为0 0 0 0 0 0 1 1
4为0 0 0 0 0 1 0 0
a为0 0 0 0 0 0 0 0 = 0
1.2 取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100
想保存的位全部与1按位与
2.按位或运算符( | )
只要二进制位上有一个为1,则返回1,不然返回0
int main()
{
int a ;
a = (3 | 4);
cout << a << endl;
system("pause");
return 0 ;
}
0 | 0 | 1 | 1 | 3 |
---|---|---|---|---|
0 | 1 | 0 | 1 | 5 |
0 | 1 | 1 | 1 | 7 |
a或b为真,结果为真
按位或的用途( | )
2.1 将指定位改为1
将46从左往右数的第4,5,7,8位改为1
0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 46 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 27 |
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 63 |
int a ;
a = (46 | 27);
cout << a << endl;
system("pause");
return 0 ;
3.异或运算符( ^ )
参与运算的相应的二进制位相同则返回0 , 否则为1.
0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 46 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 27 |
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 53 |
int a ;
a = (46 ^ 27);
cout << a << endl;
system("pause");
return 0 ;
异或运算符的用途
1.使特定位翻转
特定位设与1异或,1返回0,0返回1,实现翻转
2.与0相“异或”,保留原值
原数中的1与0进行异或运算得1,0^0得0,故保留原数
3.交换两个值,不用临时变量
int a = 5 , b = 9;
a = a ^ b ;
b = b ^ a ;
a = a ^ b ;
cout << a << endl << b << endl;
system("pause");
return 0
4.取反运算符( ~ )
将整数的二进制位全部反转。
十进制输出是-8,,,不懂,不懂
爆是不可能爆的,8进制都没,10进制怎么爆呢
5.左移运算符(<<)
二进制位向右移动,空出补0,溢出舍去。
例子
int a = 5 ;
a = (a<<2) ;
cout << a << endl ;
system("pause");
return 0
5
101
5<<2
10100 = 20
但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况
x<<n , 等价对做操作数乘上=2^n
6.右移运算符(>>)
1、左操作数为unsigned,右移,高位补0。
2、左操作数为singed,(逻辑位移)高位补0,(算数位移)补符号位。
总结
1. 保存特定位 :按位与1(&)
2. 特定位改1 :按位或1(|)
3. 反转、保留原值、交换值:按位异或( ^ )
综合例题,编写getbits(x , p , n ),返回x中第p位开始n位的值
#include <iostream>
#include <windows.h>
using namespace std;
int getbits(unsigned x , int p , int n);
int main()
{
int a , b , result;
unsigned int x ;
cin >> x >> a >> b ;
result = getbits(x , a , b) ;
cout << result << endl ;
system("pause");
return 0 ;
}
int getbits(unsigned x , int p , int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
要返回位,就是按位与运算
x >> (p+1-n)
是将要返回最后一位移到最右边,假设最右为0位
~(~0 << n)
最后边的n位为1,其余为0;
按位与,得到答案