1 bitset函数
计算机的内存数据存储是一个个小格子,每个小格子0或1,位运算就是算这些小格子里面的数据。
在数据加密、解密;算法优化有很大的作用。
#include <iostream>
#include <bitset>
int main()
{
int a{ (int)0b111111111111111111111111111111111111111111 };//oxffffffff
std::cout << a << std::endl;
std::cout << std::bitset<32>(a);
return 0;
}
2 左移右移
int a{ (int)0b111111111111111111111111111111111100000000 };//oxffffffff
a <<= 8;
std::cout << std::bitset<32>(a) << std::endl;
unsigned b{ (unsigned)a };
b >>= 7;
std::cout << std::bitset<32>(b) << std::endl;
看下面一个现象 为什么a先左移 再右移位以后不用0来补 用1来补 ???
#include <iostream>
#include <bitset>
int main()
{
int a{ 11111111111111111111111111111111 };//oxffffffff
a <<= 8;
std::cout << std::bitset<32>(a) << std::endl;
unsigned b{ (unsigned)a };
b >>= 7;
std::cout << std::bitset<32>(b) << std::endl;
a >>= 7;
std::cout << std::bitset<32>(a) << char(10);
return 0;
}
a 是带符号的整数值,b是无符号做位移操作的时候用0来补,而a做移位的时候有可能补0也有可能补1;原因
此时+3 加上-3 为 1 0 0 0 0 1 1 0 ,这是一个负数(-6),肯定不是0,如果是0全部都是0;那这种计数方式人看着特别爽,但是计算机看了直摇头;所以为了计算机又有一种计算方式,2来补码;方法如下:
比如内存格子八个格子3的存储:00000011;先翻个个:1 1 1 1 1 1 0 0;然后再给这个数加一;1 1 1 1 1 1 0 1 !!!
这个变化以后的数字就是-3! 1 1 1 1 1 1 0 1(补码应运而生)
人看着很难受 !计算机很爽!因为它的计算方便了;此时+3 加上 -3;
0 0 0 0 0 0 1 1
1 1 1 1 1 1 0 1 +
一路往前进位 所有的都变0
往前移位相当于乘以2,因为二进制,一个格子有两个0 ,1,两种可能性,往前走一个格子相当于乘以2;
a << N = a * 2^N
向右位移 相当于做除法;
题归正传:int 右移为什么是 补位 1?
因为-3是一个负数;右移位以后 必须保持符号位移运算的基本规则 保持移位数字本身的正负性;左移乘 右移除;
正数右移补0,负数右移补1,
负数右移位以后 左边要补1;保持正负性
3.位移运算求反~ 、与&、或|、异或^(不进位加法运算)