从二进制位到提取每个二进制位到C++中bitset使用
移位运算分为逻辑移位和算术移位。
逻辑移位:移出去的位就丢弃,空缺位用0填充;
算术移位:移出去的位丢弃,空缺位用“符号位来填充”,一般用在右移运算中。
对于有符号整数和无符号整数左移和右移运算是不同的。
(1)对于无符号整数,左移和右移运算都是逻辑移位。
(2)对于有符号整数,比如int类型:
左移是逻辑移位;右移是算术移位,即:按二进制形式把所有数字向右移动相应的位数,低位移出(舍弃),正数,高位的空位补0。负数,高位的空位补1.。
对有符号整型和无符号整型产生的效果:
(1)无符号左移n位
不溢出的情况下,相当于对此数乘以2的n次方
(2)无符号右移n位
不溢出的情况下,相当于对此数除以2的n次方
(3)有符号左移n位
在一定范围内相当于对此数乘以2的n次方,但是由于有符号整数第一位0代表正,1代表负,所以移位可能会改变符号位。
具体来说:
对于正数,符号位是0,则在右移的过程中,只要第一个1没有移动到首位,那么每一次就相当于在乘二。
对于负数,左移会将首位的1变成零,所以不符合除法规则。
(4)有符号右移n位
对于正数来说,在不溢出的情况下每一次右移都相当于对该数除以2,对于负数来说,移一位相当于除以2,不会出现溢出的情况。
了解清楚了移位规则,下面谈谈怎么提取一个正数的每一个二进制位:
vector<int> getEveryBit(int num)
{
int temp = 1;
vector<int>count(32,0);
for(int i=1;i<=32;++i)
{
if(num&temp)
count[i] = 1;
temp<<= 1;
}
return count;
}
下面引入c++中bitset
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。
构造函数
bitset常用构造函数有四种,如下
bitset<4> bitset1; //无参构造,长度为4,默认每一位为0
bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充
string s = "100101";
bitset<10> bitset3(s); //长度为10,前面用0补充
char s2[] = "10101"