C++自学13:位运算(std::bitset)
原创
©著作权归作者所有:来自51CTO博客作者文天大人的原创作品,请联系作者获取转载授权,否则将追究法律责任
一:从屏幕上打印出二进制
使用biteset打印出二进制,用法
std::bitset<从低位开始要显示多少位>(要显示的变量)
#include "pch.h"
#include <iostream>
#include <bitset>//引用头文件biteset
int main()
{
int a = (int)0b01111111'10111111'11011111'11101111;
std::cout << std::bitset<32>(a) << std::endl;
std::cout << std::bitset<16>(a) << std::endl;
}
下面看一个右移的例子
// 有符号
char a = (char)0b11111111;
a >>= 3;
std::cout << std::bitset<8>(a) << std::endl;
// 无符号
unsigned char b = (char)0b11111111;
b >>= 3;
std::cout << std::bitset<8>(b) << std::endl;
多数c++编译器右移的时候,如果这个数原本就是负数,那么就补1,如果原本就是正数,那么就补0,当然,也不绝对,这取决于具体编译器和操作系统两个因素,不过主要目的就是为了保持和原来的数的符号一致,关于更多位运算,应参考我的其他文章计算机系统-字/数字电路/数值表达/进制
额外说一下异或
异或在实际的应用场景是什么呢?
1.异或是用来统计两个数的差异的,比如上面这段代码,打印出00011110,其中1表示的就是差异
int a = (int)0b11111111;
int b = (int)0b11100001;
std::cout << std::bitset<8>(a^b) << std::endl;
2.如果a异或b等于c,那么a异或c一定等于b,b异或c也一定等于a,这个特性在加密技术上会有用,下面是使用异或ab互换
int a = 1;
int b = 2;
a = (b=(a^b))^a;//b=c,a=2;
b = b ^ a;
std::cout << a << std::endl;
std::cout << b << std::endl;