Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เขียนโปรแกรม C ที่มีประสิทธิภาพเพื่อย้อนกลับบิตของตัวเลขใน C++


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