C++ 如何在一个数字中打开特定的比特位

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++的内置位运算符来操作位,我们开发了一个具有恒定时间复杂度的有效方法。

关于这个问题,我相信这篇文章可以帮助你理解你的所有概念。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程