如何在數字中開啟特定位?


題目說明我們需要將數字中的特定位設定為1。簡單來說,我們要做的就是將數字中的某一位替換為1。如果該位已經是1,則保持不變。

可以使用二進位制數表示整數,二進位制數只有0和1兩種形式,每一位代表2的冪。

讓我們用二進位制數表示5。

5的二進位制形式為101,即$\mathrm{2^{2} + 2^{0}= 5.}$

在這個問題中,將給出一個數字N和一個數字A作為輸入。我們的任務是將N中的第A位更改為1。如果N中第A位已經是1,則保持不變。這就是我們如何在一個數字中開啟第A位的方法。

例如:

輸入

N=10 , A=3

輸出

14

解釋:10的二進位制表示為1010。因此,將第A位(即第3位)更改為1將使其變為1110。這是該數字的二進位制表示:

$\mathrm{2^{3}+2^{2}+2^{1}=14}$

輸入

N=18 , A=6

輸出

50

解釋:18的二進位制形式為10010。現在,開啟第6位將使其變為110010。這個二進位制數的十進位制值為50。

$\mathrm{2^{5}+2^{4}+2^{1}=50}$

讓我們看一下將給定數字中的特定位更改為1的演算法。

演算法

可以使用位操作和按位運算子來解決此問題。如果我們檢視問題陳述,我們只需要將第A位更改為1,這可以使用OR運算子完成。如果兩個位都是0,則OR運算子返回0;如果兩個位中任何一個位是1,則返回1。

如果我們可以得到一個第A位為1而其他位都為0的數字,我們可以對這兩個數字進行按位 |(OR)運算,以獲得所需的結果,因為它將在該位為0時將其更改為1,或者在該位為1時保持不變。

我們可以用一個例子來理解上述概念

假設我們給定N=8和A=3,這意味著我們需要將第3位更改為1。

為了得到第3位為1而其他位都為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小於或等於0,則返回數字N。

  • 如果A>0,我們需要更改數字的第A位。

  • 只需將1左移A-1位即可在第A位獲得1,並將其餘位保持為0。

  • 然後使用OR運算子對數字N和(1<<(A-1))進行運算,以獲得更改數字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中的特定位設定為1的演算法。透過利用C++內建的按位運算子進行位操作,我們開發了一種有效的方法,其時間複雜度為常數。

關於這個問題,我相信這篇文章可以幫助你理解你所有的概念。

更新於:2023年8月21日

瀏覽量:183

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.