位运算

代码:

#include <iostream>
#include<bitset>  //位运算
int main()
{
	using std::cout;
	using std::cin;
	using std::endl;
	
	int a{ (int)0b111'111'111'111'111'111'111'111'111'111'11 };//0b 表示2进制数,a等于 -1
	a <<= 8;
	cout << std::bitset<32>(a) << endl;//a为111'111'111'111'111'111'111'111'000'000'00

	unsigned b{ (unsigned)a };
	b >>= 7;
	cout << std::bitset<32>(b) << endl;//b为000'000'011'111'111'111'111'111'111'111'10

	a >>= 7;
	cout << std::bitset<32>(a) << endl;//a为111'111'111'111'111'111'111'111'111'111'10

	int c{ 0b000'000'000'000'000'000'000'000'000'000'11 };
	cout << std::bitset<32>(c) << endl;
	cout << c << endl;//c为3,负数转正数,取反+1

	int d{(int)0b111'111'111'111'111'111'111'111'111'111'01};
	cout << std::bitset<32>(d) << endl;
	cout << d << endl;//d为-3; 正数转负数.将为全部取反+1
	/*
	int为有符号类型,负数最高位为1,正数高位为1
	所以,在做右移运算时,int有不确定因数,移的位数可能为0,可能为1
    unsigned 没有负数,高位必须为0,左移右移都为0,
	a往左位移N位,就是a乘以2的N次方,同理a往左位移N次方,结果就是a除以2的N次方
	*/
	int e{ -100 }, f{ 100 };
	e >>= 1; //e为 -50
	cout << e<<endl;
	f <<= 1; //f为200
	cout << f << endl;
	/*
	取反
	*/
	int g{ -2};
	cout << g << endl; 
	cout << std::bitset<32>(g) << endl;
	g = ~g; 
	cout << g << endl; //g为 1
	cout << std::bitset<32>(g) << endl;
	/*
	与运算
	都为1等于1,其中有1位为0结果为0
	*/
	int a1{ 0x2833 };//保留高位28
	a1 = a1 & 0xff00;//ff为11111111,00为00000000,所以a1为0x2800
	cout << std::hex << a1 << endl;//std::hex 显示为16进制
	a1 >>= 8; //只读取0x28
	cout << "a1= "<<std::hex << a1 << endl;
	/*
	或运算
	有1位为1结果为1,全部为0结果为0
	*/
	int ha1{ 0b111'000'11 };
	int ha2{ 0b111'110'01 };
	int ha3 = ha1 | ha2;//ha3结果为:111'110'11
	cout << "ha3= "<<std::bitset<8>(ha3) << endl;

	/*
	异或运算
	都为1结果为0,有1位为1结果为1.
	a=b^c;b=a^c;c=a^b
	*/
	int ya1{ 0b11'111'001 };
	int ya2{ 0b11'000'001 };

	int ya3 = ya1 ^ ya2;//ya3结果为:00'111'000
	cout << "ya3= "<<std::bitset<8>(ya3) << endl;
}

腾讯课堂-易道云学院

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值