ในปัญหานี้ เราได้รับจำนวนเต็ม 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