目录
7.1404. 将二进制表示减到 1 的步骤数 - 力扣(LeetCode)
1.2044. 统计按位或能得到最大值的子集数目 - 力扣(LeetCode)
一、位与习题(续第一天)
7.1404. 将二进制表示减到 1 的步骤数 - 力扣(LeetCode)
给你一个以二进制形式表示的数字 s 。请你返回按下述规则将其减少到 1 所需要的步骤数:
如果当前数字为偶数,则将其除以 2 。
如果当前数字为奇数,则将其加上 1 。
题目保证你总是可以按上述规则将测试用例变为 1 。
class Solution {
public:
int numSteps(string s) {
int step=0;
//atoi(s.c_str());s=“1101”转换为十进制数字1101,不是二进制1101.
while(s!="1")
{
++step;//下面的所有情况都是需要1个步骤,step可以在外面+1
//末元素是0,数字为偶数,将其除以2,而对一个二进制数除以2,相当于去除末尾0,eg 1000 除以2 为100
if(s.back()=='0')//back末元素
s.pop_back();//删除最末一个元素
else{
//末元素为1,
for(int i=s.size()-1;i>=0;--i) //10011从右侧往左遍历
{
//奇数,加一;二进制数+1 101 +1 = 110 若111 +1 = 1000
if(s[i]=='1'){
s[i]='0';
if(i==0){
s="1"+s;
break;
}
}
else{
s[i]='1';
break;
}
}
}
}
return step;
}
};
8.201. 数字范围按位与 - 力扣(LeetCode)
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int sum=left;
for(int i=left;i<right;i++)
{
sum&=(i+1);
}
return sum;
}
};
9.面试题 05.01. 插入 - 力扣(LeetCode)
难死我了,占位。
10.982. 按位与为零的三元组 - 力扣(LeetCode)
难死我了,占位。
二、位或知识点
1.位或的定义:
位或运算符有两个操作数,表示为x | y
对操作数的每一位进行运算,都是0的时候结果为0,否则为1
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
举例:0b1010 | 0b0110 = 0b0110;(0b为二进制数前缀)
2.位或运算符的简单应用
(1)设置标记位
判断一个数二进制低位的第五位,如果为0,则将它置为1.
x|0b100000
(2)置空标记位
判断一个数二进制低位的第五位,如果为1,则将它置为0.
x&0b11111111111111111111111111101111 //法一
(x|0b10000)-0b10000 //法二
首先将低位的第五位换成1,然后去掉。
1|1=1, 1|0=1 不管是1还是0,与1位或还是1,第五位强制转换为1, 然后减10000,低位的第五位变成0.
(3)低位0变1
一个整数x,将它低位连续的0都变成1
100……00 | 011……00 = 111……11
x|(x-1)
三、习题
1.2044. 统计按位或能得到最大值的子集数目 - 力扣(LeetCode)
明天再说吧。