网址: www.nowcoder.com/practice/8e…
描述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:- 2^{31} <= n <= 2^{31}-1−231<=n<=231−1
即范围为:-2147483648<= n <= 2147483647,−2147483648<=n<=2147483647
public:
int NumberOf1(int n) {
bitset<32> bit (n);
return bit.count();
}
};
总结:
bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。bitset有一个特性:整数类型和布尔数组都能转化成bitset。
bitset在转换负数时会自动转换为负数的存储形式——补码的形式。
bitset类型在定义时就需要指定所占的空间,例如
bitset<233>bit; //定义了一个长度为233,名字为bit的二进制数
bitset<4> bitset1; //无参构造,长度为4,默认每一位为0
bitset<8> bitset2(12); //长度为8,用二进制保存十进制数12,前面用0补充
string s = "100101";
bitset<10> bitset3(s); //长度为10,前面用0补充
char s2[] = "10101";
bitset<13> bitset4(s2); //长度为13,前面用0补充
可以通过 [ ] 访问、赋值元素(类似数组),注意最低位下标为0,如下:
bitset<4> bit ("1011");
cout << bit[0] << endl; //1
cout << bit[1] << endl; //1
cout << bit[2] << endl; //0
bitset的相关函数
对于一个叫做foo的bitset:
foo.size() 返回大小(位数)
foo.count() 返回1的个数
foo.any() 返回是否有1
foo.none() 返回是否没有1
foo.set() 全都变成1
foo.set(p) 将第p + 1位变成1
foo.set(p, x) 将第p + 1位变成x
foo.reset() 全都变成0
foo.reset(p) 将第p + 1位变成0
foo.flip() 全都取反
foo.flip(p) 将第p + 1位取反
foo.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
foo.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
foo.to_string() 返回它转换为string的结果