计算与 A 的按位或等于 B 的值
给定两个整数A和B ,任务是计算满足条件A |的X的可能值。 X = B。
注: |表示按位或运算。
例子:
Input: A = 2, B = 3
Output: 2
Explanation:
Since, 2 | 1 = 3 and 2 | 3 = 3. Therefore, the possible values of x are 1 and 3.
Input: A = 5, B = 7
Output: 4
朴素方法:解决此问题的最简单方法是遍历范围[1, B]并检查每个数字,其与A的按位 OR是否等于B。如果满足条件,则增加计数。
时间复杂度: O(b)
辅助空间: O(1)
有效方法:上述方法可以根据以下观察进行优化:
- 将数字 A 和 B 转换为它们各自的二进制表示。
Truth table of Bitwise OR operation:
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0 - 对于每个相同位置的位,通过按位或运算,计算A中的第 i位可以转换为B中的第i位的次数。
请按照以下步骤解决问题:
- 初始化一个变量ans以存储所需的结果。
- 使用变量i同时遍历a和b的位
- 如果a的第 i 位被置位, b的第 i 位也被置位,那么x的第 i 位可以取 2 个值,即 0 或 1。因此,将ans乘以 2。
- 如果a的第 i 位未设置,而b的第 i 位已设置,则x的第 i 位只能取 1 个值,即 1。因此,将ans乘以 1。
- 如果a的第 i 位被设置而b的第 i 位未设置,那么无论x的第 i 位是什么, a的第 i 位都不能转换为b的第 i 位。因此,将ans更新为 0 并跳出循环。
- 打印ans的值作为结果
下面是上述方法的实现:
C++
// C++ program for the above approach #include
using namespace std; // Function to count possible values of // X whose Bitwise OR with A is equal to B int numWays(int a, int b) { // Store the required result int res = 1; // Iterate over all bits while (a && b) { // If i-th bit of a is set if ((a & 1) == 1) { // If i-th bit of b is set if ((b & 1) == 1) { // The i-th bit in x // can be both 1 and 0 res = res * 2; } else { // a|x is equal to 1 // Therefore, it cannot // be converted to b return 0; } } // Right shift a and b by 1 a = a >> 1; b = b >> 1; } return res; } // Driver Code int main() { // Given Input int a = 2, b = 3; // Function Call cout << numWays(a, b); return 0; } 输出:2
时间复杂度: O(max(log a, log b))
辅助空间: O(1)