小白重学中:位运算符


在学习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 ;
}
00113
01015
00011

ab为真,结果为真

按位与的用途( & )

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 ;
}

在这里插入图片描述

00113
01015
01117

ab为真,结果为真

按位或的用途( | )

2.1 将指定位改为1
将46从左往右数的第4,5,7,8位改为1

0010111046
0001101127
0011111163
	int a ; 
	a = (46 | 27);
	cout << a << endl;
	system("pause");
	return 0 ;

在这里插入图片描述

3.异或运算符( ^ )

参与运算的相应的二进制位相同则返回0 , 否则为1.

0010111046
0001101127
0011010153
	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;
按位与,得到答案
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值