如何在數字中開啟特定位?
題目說明我們需要將數字中的特定位設定為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++內建的按位運算子進行位操作,我們開發了一種有效的方法,其時間複雜度為常數。
關於這個問題,我相信這篇文章可以幫助你理解你所有的概念。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP