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

นับบิตไม่เซ็ตในช่วงใน C++


เราได้รับจำนวนเต็มสมมติว่า num และช่วงกับค่า left และ right งานคือการคำนวณเลขไบนารีของตัวเลขก่อน แล้วตั้งลูปจากหลัก left ถึง right และในช่วงที่กำหนดคำนวณบิตไม่เซ็ต

บิตไม่เซ็ตในตัวเลขไบนารีแทนด้วย 0 ทุกครั้งที่เราคำนวณตัวเลขไบนารีของค่าจำนวนเต็ม มันจะประกอบด้วย 0 และ 1 ดังนั้น ตัวเลข 0 จึงเรียกว่า unset bit ในทางคอมพิวเตอร์

อินพุต − int number = 50, left = 2, right = 5

เอาต์พุต − นับบิตไม่เซ็ตทั้งหมดในช่วงคือ − 2

คำอธิบาย − การแทนค่าไบนารีของตัวเลข 50 คือ 110010 และเรามีช่วงเริ่มจาก left = 2 ซึ่งมีบิตเป็น 1 และจบที่ right = 5 ซึ่งมีบิต 1 และระหว่างช่วงเรามี 0 สองตัว ดังนั้นจำนวนบิตไม่เซ็ตคือ 2

อินพุต − int number = 42, left = 1, right 6

เอาต์พุต − นับบิตไม่เซ็ตทั้งหมดในช่วงคือ − 3

คำอธิบาย − การแทนค่าไบนารีของตัวเลข 42 คือ 101010 และเรามีช่วงเริ่มจาก left = 1 ซึ่งมีบิตเป็น 1 และจบที่ right = 6 ซึ่งมีบิต 0 และระหว่างช่วงเรามี 0 สามตัว ดังนั้นจำนวนคือ 3

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • รับตัวเลขในตัวแปรประเภทจำนวนเต็มและช่วงกับค่า left และ right แบบจำนวนเต็ม

  • ประกาศตัวแปร count เพื่อเก็บจำนวนบิตเซ็ตทั้งหมดแบบ unsigned int

  • เริ่มลูป FOR จาก i = 1<<7 และ i > 0 และ i = i / 2

  • ภายในลูป ตรวจสอบ num & 1 == TRUE แล้วพิมพ์ 1 มิฉะนั้นพิมพ์ 0

  • เริ่มลูป FOR จาก i = left ถึง right

  • ภายในลูป เพิ่มจำนวนบิตทั้งหมดในช่วงที่กำหนด

  • เริ่มลูป while เพื่อคำนวณจำนวนบิตทั้งหมดจนกว่าตัวเลขจะไม่เป็น 0

  • ภายในลูป ตั้ง count = count + number & 1 และตั้ง number >>=1

  • ตั้งตัวแปรชั่วคราว a ด้วย ((1 << right) - 1) ^ ((1 << (left - 1)) - 1)

  • ตั้ง count ด้วย count & a

  • ในที่สุด ตั้ง count เป็น จำนวนบิตทั้งหมดในช่วง - จำนวนบิตเซ็ตในช่วง

ตัวอย่าง

#include<iostream> using namespace std; //Count total unset bits in a range unsigned int unset_bits(unsigned int number, unsigned int left, unsigned int right){    unsigned int count = 0;    unsigned int total_bits = 0;    unsigned i;    //display the 8-bit number    cout<<"8-bit number of "<<number<<" is: ";    for (i = 1 << 7; i > 0; i = i / 2){       (number & i)? cout<<"1": cout<<"0";    }    //calculate total number of bits in a given range    for(i = left; i<=right; i++){       total_bits++;    }    //calculate the total bits in a number    while (number){       count += number & 1;       number >>= 1;    }    //calculate the set bit in a range    int a = ((1 << right) - 1) ^ ((1 << (left - 1)) - 1);    count = count & a;    //subtract set bits from the total bits in a range    count = total_bits - count;    cout<<"\nCount of total unset bits in a range are: "<<count; } int main(){    unsigned int number = 80;    unsigned int left = 1, right = 4;    unset_bits(number, left, right);    return 0; }

เอาต์พุต

ถ้าเรารันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −

8-bit number of 80 is: 01010000 Count of total unset bits in a range are: 2