位运算位或

这篇博客深入探讨了位操作中的位与和位或知识点,包括将二进制数减到1的步骤数、数字范围按位与的计算,以及位或在设置标记位、置空标记位和低位0变1等场景的应用。同时,文章提供了相关LeetCode题目作为实践练习,帮助读者巩固理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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

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)

明天再说吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值