เราได้รับตัวเลขและภารกิจคือการคำนวณการนับตัวเลขจากช่วง 0 จนถึงจำนวนที่กำหนด สมมติว่า num มีหนึ่งชุดบิตที่แน่นอน
ชุดบิตในเลขฐานสองจะถูกแทนด้วย 1 เมื่อใดก็ตามที่เราคำนวณเลขฐานสองของค่าจำนวนเต็ม มันจะถูกสร้างขึ้นเป็นการรวมกันของ 0 และ 1 ดังนั้น ตัวเลข 1 จึงเรียกว่า set bit ในแง่ของคอมพิวเตอร์
ป้อนข้อมูล − int num =15
ผลผลิต − จำนวนตัวเลขที่มีเพียง 1 ชุดบิตในช่วง [0, 15] คือ − 4
คำอธิบาย − ตัวเลขที่ระบุคือ 15 ดังนั้นช่วงคือ 0-15 ตอนนี้คำนวณ 4 หลัก
เลขฐานสองสำหรับ −
0 -> 0000 =0 ชุดบิต 1 -> 0001 =1 ชุดบิต 2 -> 0010 =1 ชุดบิต 3 -> 0011 =2 ชุดบิต 4 -> 0100 =1 ชุดบิต 5 -> 0101 =2 ชุดบิต 6 -> 0110 =2 ชุดบิต 7 -> 0111 =3 ชุดบิต 8 -> 1000 =1 ชุดบิต 1 -> 1001 =2 ชุดบิต 10 -> 1010 =2 ชุดบิต 11 -> 1011 =3 ชุดบิต 12 -> 1100 =2 ชุดบิต 13 -> 1101 =3 ชุดบิต 14 -> 1110 =3 ชุดบิต 15 -> 1111 =4 ชุดบิต ตอนนี้เราจะเลือกตัวเลขที่มีบิตเซ็ตเดียว นั่นคือ 1, 2, 4 และ 8
ป้อนข้อมูล − int num =4
ผลผลิต − จำนวนตัวเลขที่มีเพียง 1 ชุดบิตในช่วง [0, 15] คือ − 3
คำอธิบาย − จำนวนที่กำหนดคือ 4 ดังนั้นช่วงคือ 0-4 ตอนนี้คำนวณเลขฐานสอง 4 หลัก
หมายเลขสำหรับ −
0 -> 0000 =0 ชุดบิต 1 -> 0001 =1 ชุดบิต 2 -> 0010 =1 ชุดบิต 3 -> 0011 =2 ชุดบิต 4 -> 0100 =1 ชุดบิต ตอนนี้เราจะเลือกตัวเลขที่มีบิตชุดเดียว นั่นคือ 1, 2 และ 4
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
อาจมีหลายวิธีในการแก้ปัญหาที่กำหนด เช่น แนวทางไร้เดียงสาและแนวทางที่มีประสิทธิภาพ มาดูแนวทางไร้เดียงสากันก่อน .
-
ป้อนหมายเลขแล้วส่งต่อไปยังฟังก์ชันเพื่อดำเนินการต่อไป
-
ใช้การนับตัวแปรชั่วคราวเพื่อเก็บการนับจำนวนในช่วงโดยกำหนดให้บิตเป็น 1
-
เริ่มวนซ้ำ FOR จาก i ถึง 1 จนถึงจำนวน
-
ภายในลูป ให้ตั้งค่าตัวแปร temp ด้วย ' __builtin_popcount(i)' ซึ่งเป็นฟังก์ชันที่คืนค่าจำนวนบิตที่ตั้งไว้
-
ตรวจสอบ IF temp =1 แล้วเพิ่มการนับ
-
จำนวนคืน
-
พิมพ์ผล
แนวทางที่มีประสิทธิภาพ
-
ป้อนหมายเลขแล้วส่งต่อไปยังฟังก์ชันเพื่อดำเนินการต่อไป
-
ใช้การนับตัวแปรชั่วคราวเพื่อเก็บการนับจำนวนในช่วงโดยกำหนดให้บิตเป็น 1
-
เริ่มวนรอบในขณะที่จาก temp ถึง temp <=number
-
ภายในลูป ให้เพิ่มจำนวนขึ้น 1 และตั้งค่า temp เป็น temp * 2
-
จำนวนคืน
-
พิมพ์ผล
ตัวอย่าง (แนวทางไร้เดียงสา)
#include <iostream>
using namespace std;
//function to Count of numbers having only 1 set bit in the range [0, n]
int set_bits(int number){
int count = 0;
for (int i = 1; i <= number; i++){
int temp = __builtin_popcount(i);
if (temp == 1){
count++;
}
}
return count;
}
int main(){
int number = 15;
cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of numbers having only 1 set bit in the range [0, 15] are: 4
ตัวอย่าง (แนวทางที่มีประสิทธิภาพ)
#include <iostream>
using namespace std;
//function to Count of numbers having only 1 set bit in the range [0, n]
int set_bits(int number){
int count = 0;
int temp = 1;
while(temp <= number){
count++;
temp = temp *2;
}
return count;
}
int main(){
int number = 15;
cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of numbers having only 1 set bit in the range [0, 15] are: 4