วันนี้ฉันต้องการอัลกอริทึมอย่างง่ายสำหรับการตรวจสอบว่าตัวเลขมีค่าเป็น 2 หรือไม่
อัลกอริทึมจะต้อง:
- ง่าย
- ถูกต้องสำหรับ
ulong
ค่าใด ๆ
ฉันมากับอัลกอริทึมง่าย ๆ นี้:
private bool IsPowerOfTwo(ulong number)
{
if (number == 0)
return false;
for (ulong power = 1; power > 0; power = power << 1)
{
// This for loop used shifting for powers of 2, meaning
// that the value will become 0 after the last shift
// (from binary 1000...0000 to 0000...0000) then, the 'for'
// loop will break out.
if (power == number)
return true;
if (power > number)
return false;
}
return false;
}
แต่ฉันก็คิดว่าการตรวจสอบว่าเป็นจำนวนที่แน่นอน แต่เมื่อฉันตรวจสอบ 2 ^ 63 + 1 กลับได้ 63 ทั้งหมดเพราะการปัดเศษ ดังนั้นฉันจึงตรวจสอบว่า 2 ต่อกำลัง 63 เท่ากับจำนวนเดิม - และเป็นเพราะการคำนวณเสร็จในs และไม่ใช่ตัวเลขที่แน่นอน:log2 x
Math.Log
double
private bool IsPowerOfTwo_2(ulong number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
นี้ถูกส่งกลับสำหรับค่าที่ไม่ถูกต้องได้รับ:true
9223372036854775809
มีอัลกอริทึมที่ดีกว่าหรือไม่
(x & (x - 1))
อาจจะกลับมาบวกเท็จเมื่อเป็นผลรวมของอำนาจของทั้งสองเช่นX
8 + 16