10.02_按位或

按位或

问题描述

按位或运算(|)是一种基本的位运算,当两个位至少有一个为1时结果为1,否则为0。常用于位标记、状态合并等场景。
性质:越或越大。

基本操作

算法思想

  1. 至少一个位为1时结果为1
  2. 可用于设置特定位
  3. 适用于状态合并和标记设置
  4. 时间复杂度

代码实现

class Solution {
public:
    // 设置位
    int setBit(int x, int pos) {
        return x | (1 << pos);
    }
    
    // 设置最低的n位
    int setLowestBits(int x, int n) {
        return x | ((1 << n) - 1);
    }
    
    // 合并状态
    int mergeState(int state1, int state2) {
        return state1 | state2;
    }
    
    // 判断是否包含子集
    bool containsSubset(int set, int subset) {
        return (set | subset) == set;
    }
};
class Solution {
    // 设置位
    public int setBit(int x, int pos) {
        return x | (1 << pos);
    }
    
    // 设置最低的n位
    public int setLowestBits(int x, int n) {
        return x | ((1 << n) - 1);
    }
    
    // 合并状态
    public int mergeState(int state1, int state2) {
        return state1 | state2;
    }
    
    // 判断是否包含子集
    public boolean containsSubset(int set, int subset) {
        return (set | subset) == set;
    }
}
class Solution:
    # 设置位
    def setBit(self, x: int, pos: int) -> int:
        return x | (1 << pos)
    
    # 设置最低的n位
    def setLowestBits(self, x: int, n: int) -> int:
        return x | ((1 << n) - 1)
    
    # 合并状态
    def mergeState(self, state1: int, state2: int) -> int:
        return state1 | state2
    
    # 判断是否包含子集
    def containsSubset(self, set_: int, subset: int) -> bool:
        return (set_ | subset) == set_

时间复杂度分析

操作 时间复杂度 空间复杂度
基本按位或
设置位
合并状态
子集判断

应用场景

  1. 状态合并
  2. 权限设置
  3. 标记管理
  4. 集合运算
  5. 特征标记

注意事项

  1. 运算优先级
  2. 位数限制
  3. 状态冲突
  4. 溢出处理
  5. 性能优化

常见变形

  1. 权限管理
class Solution {
public:
    // 添加权限
    int addPermission(int current, int permission) {
        return current | permission;
    }
    
    // 批量添加权限
    int addPermissions(int current, vector<int>& permissions) {
        int result = current;
        for (int perm : permissions) {
            result |= perm;
        }
        return result;
    }
    
    // 检查是否有任一权限
    bool hasAnyPermission(int current, int permissions) {
        return (current & permissions) != 0;
    }
};
class Solution {
    // 添加权限
    public int addPermission(int current, int permission) {
        return current | permission;
    }
    
    // 批量添加权限
    public int addPermissions(int current, int[] permissions) {
        int result = current;
        for (int perm : permissions) {
            result |= perm;
        }
        return result;
    }
    
    // 检查是否有任一权限
    public boolean hasAnyPermission(int current, int permissions) {
        return (current & permissions) != 0;
    }
}
class Solution:
    # 添加权限
    def addPermission(self, current: int, permission: int) -> int:
        return current | permission
    
    # 批量添加权限
    def addPermissions(self, current: int, permissions: List[int]) -> int:
        result = current
        for perm in permissions:
            result |= perm
        return result
    
    # 检查是否有任一权限
    def hasAnyPermission(self, current: int, permissions: int) -> bool:
        return (current & permissions) != 0
  1. 状态合并
class Solution {
public:
    // 合并多个状态
    int mergeStates(vector<int>& states) {
        int result = 0;
        for (int state : states) {
            result |= state;
        }
        return result;
    }
    
    // 设置状态区间
    int setStateRange(int x, int start, int len) {
        int mask = ((1 << len) - 1) << start;
        return x | mask;
    }
    
    // 合并带优先级的状态
    int mergePriorityStates(int highPriority, int lowPriority) {
        return highPriority | (lowPriority & ~highPriority);
    }
};
class Solution {
    // 合并多个状态
    public int mergeStates(int[] states) {
        int result = 0;
        for (int state : states) {
            result |= state;
        }
        return result;
    }
    
    // 设置状态区间
    public int setStateRange(int x, int start, int len) {
        int mask = ((1 << len) - 1) << start;
        return x | mask;
    }
    
    // 合并带优先级的状态
    public int mergePriorityStates(int highPriority, int lowPriority) {
        return highPriority | (lowPriority & ~highPriority);
    }
}
class Solution:
    # 合并多个状态
    def mergeStates(self, states: List[int]) -> int:
        result = 0
        for state in states:
            result |= state
        return result
    
    # 设置状态区间
    def setStateRange(self, x: int, start: int, length: int) -> int:
        mask = ((1 << length) - 1) << start
        return x | mask
    
    # 合并带优先级的状态
    def mergePriorityStates(self, high_priority: int, low_priority: int) -> int:
        return high_priority | (low_priority & ~high_priority)

经典例题

  1. 1 or 0
牛客代码笔记-牛栋 文章被收录于专栏

汗牛充栋,学海无涯。<br/> 内含算法知识点讲解,以及牛客题库精选例题。<br/> 学习算法,从牛栋开始。

全部评论

相关推荐

在看数据的傻狍子很忙碌:学生思维好重,而心很急,自己想想真的能直接做有难度的东西吗?任何错误都是需要人担责的,你实习生可以跑路,你的同事领导呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务