ในปัญหานี้ เราได้รับจำนวนเต็ม n ที่ไม่ได้ลงนาม งานของเราคือสร้างโปรแกรมที่ส่งคืนตัวเลขซึ่งสร้างขึ้นโดยการกลับบิตทั้งหมดของตัวเลข
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
n = 1
ผลลัพธ์
2147483648
คำอธิบาย
binary of 1 is 000...0001, the reverse is 100...0000.
ในการแก้ปัญหานี้ เราจะใช้วิธีการง่ายๆ โดยใช้สูตรง่ายๆ เราจะวนซ้ำผ่านเลขฐานสองของตัวเลข และหาตำแหน่งของเซตบิตในจำนวนนั้นให้เรียกว่า i ผลลัพธ์จะถูกคำนวณโดยใช้สูตร ((total_number_of_bits) - 1) - i
โปรแกรมแสดงการใช้งานอัลกอริธึมนี้
ตัวอย่าง
#include<iostream>
using namespace std;
unsigned int reverseBitNumber(unsigned int num) {
unsigned int totalNumberOfBits = sizeof(num) * 8;
unsigned int reverseNumber = 0, temp;
for (int i = 0; i < totalNumberOfBits; i++){
if((num & (1 << i)))
reverseNumber |= (1 << ((totalNumberOfBits - 1) - i));
}
return reverseNumber;
}
int main() {
unsigned int n = 21;
cout<<"The number is "<<n<<endl;
cout<<"The number which has reverse bits of the number is :"<<reverseBitNumber(n);
return 0;
} ผลลัพธ์
The number is 2 The number which has reverse bits of the number is :2818572288
วิธีที่ 2
อีกวิธีหนึ่งคือการใช้ shift เราจะเลื่อนบิตของตัวเลขจนกลายเป็นศูนย์และเปลี่ยนเป็นตัวเลขย้อนกลับ จากนั้นจึงเลื่อนจำนวนบิตที่เหลือเพื่อให้ได้ผลลัพธ์
โปรแกรมแสดงการใช้งานโซลูชันของเรา
ตัวอย่าง
#include<iostream>
using namespace std;
unsigned int reverseBitNumber(unsigned int n){
unsigned int rem_shift = sizeof(n) * 8 - 1;
unsigned int reverseNubmer = n;
n >>= 1;
while(n){
reverseNubmer <<= 1;
reverseNubmer |= n & 1;
n >>= 1;
rem_shift--;
}
reverseNubmer <<= rem_shift;
return reverseNubmer;
}
int main(){
unsigned int n = 21;
cout<<"The number is "<<n<<endl;
cout<<"The number which has reverse bits of the number is :"<<reverseBitNumber(n);
return 0;
} ผลลัพธ์
The number is 21 The number which has reverse bits of the number is :2818572288