C++ 如何在一个数字中打开特定的比特位
问题陈述说我们需要在一个数字中打开一个特定的比特位。简单地说,我们只需要将数字中的某个比特位替换为1。如果已经是1,则保持原样。
您可以用二进制数表示整数,它们由0和1组成,其中每一位代表2的幂。
让我们用二进制数表示5。
5的二进制形式为101,即2^{2} + 2^{0} = 5。
在这个问题中,将给出一个数字N和一个数字A作为输入。我们的任务是将数字N中的第A个比特位改为1。如果数字N中的第A个比特位已经是1,则保持不变。这就是我们如何在一个数字中打开第A个比特位。
例如,
输入
N=10 , A=3
输出
14
说明: 10的二进制表示为1010。所以将第3位即A位改为1,它将变为1110。这是该数的二进制表示,
\mathrm{2^{3}+2^{2}+2^{1}=14}
输入:
N=18 , A=6
输出
50
解释:18用二进制形式表示为10010。现在,打开第6位(bit)会使它变为110010。该二进制数的十进制值将为50()。
\mathrm{2^{5}+2^{4}+2^{1}=50}
现在,让我们看一下将给定数字的特定位(bit)改为1的算法。
算法
这个问题可以使用位操作(bit manipulation)和位运算符实现。从问题描述中,我们只需要使用或运算符将第Ath位(bit)改为1即可。如果两个位(bit)都为0,或运算符返回0;如果任一位(bit)为1,或运算符返回1。
如果我们可以获得一个数字,其第Ath位(bit)为1,并且所有其他位(bit)都为0。我们可以对这两个数进行按位或(|)运算,以获得所需的输出,即如果该位(bit)为0,则将其更改为1,如果该位(bit)为1,则保持不变。
我们可以通过以下示例来理解上述概念:
假设我们给定N=8和A=3,这意味着我们需要将第3位(bit)改为1。
为了获得其第3位(bit)为1且所有其他位(bit)为0的数字,我们可以使用左移运算符。该运算符将数字的位向左移动。
左移运算符语法:
int a=1;
a=a<<2; //left shift a by 2
最初情况下,a等于1,可以用二进制形式表示为00001。经过将其左移2位的操作后,所有位数都向左移动了2位。
在进行此操作后,a变为00100。
在此例中,要在第3位获得1,我们需要将1左移2位。
类似地,我们可以通过将1左移(A-1)位来获得A位处的1和剩余的0。
通过对N和(1<<(A-1))应用OR运算符,我们可以将数字的A位改为1,而不改变其他位。
方法
按照以下步骤,我们可以实现上述算法:
- 首先,我们需要检查A是否大于0。如果A小于或等于零,则返回数字N。
-
如果A大于0,我们需要改变数字的A位。
-
只需将1左移A-1位,以在A位获得1并保持剩余的位为0。
-
然后,对数字N和(1<<(A-1))使用OR运算符,以获得在数字N中更改A位后的数字,这是我们的所需输出。
在C++中实现此方法:
例子
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//function to turn on Ath bit in number N
int change_bit(int N, int A){
if(A<=0){ //if the position of bit which is to be changed is less than or equal to 0, return N
return N;
}
int m=1<<(A-1); //to get 1 at Ath bit by using left shift operator
int num= N | m; //using OR operation to change the Ath bit with 1
return num; //return the number after changing Ath bit in number N
}
int main()
{
int N,A;
N=24,A=3;
cout<<"The number after turning on "<<A<<"th bit in number "<<N<<" is : "<<change_bit(N,A)<<endl;
N=55,A=8;
cout<<"The number after turning on "<<A<<"th bit in number "<<N<<" is : "<<change_bit(N,A)<<endl;
return 0;
}
输出
The number after turning on 3th bit in number 24 is : 28
The number after turning on 8th bit in number 55 is : 183
时间复杂度:O(1),因为执行这个操作所需的时间恒定。
空间复杂度:O(1),因为没有使用额外的空间。
结论
本文介绍了在数字N中激活特定位的算法。通过使用C++的内置位运算符来操作位,我们开发了一个具有恒定时间复杂度的有效方法。
关于这个问题,我相信这篇文章可以帮助你理解你的所有概念。