代码:
#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;
}