位运算位或

目录

一、位与习题(续第一天)

7.1404. 将二进制表示减到 1 的步骤数 - 力扣(LeetCode)

 8.201. 数字范围按位与 - 力扣(LeetCode)

二、位或知识点

1.位或的定义:

2.位或运算符的简单应用

(1)设置标记位

(2)置空标记位

(3)低位0变1

三、习题

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

左操作数   右操作数    结果
000
011
101
111

举例: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)

明天再说吧。


版权声明:本文为EmileJiao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。