สมมติว่าเรามีตัวเลข n เราต้องเช็คว่าเป็นเลขยกกำลัง 2 หรือเปล่า เท่ากับ n =16 ผลลัพธ์จะเป็นจริง ถ้า n =12 มันจะเป็นเท็จ
เพื่อแก้ปัญหานี้ เราจะใช้การดำเนินการทางตรรกะ หากเราเห็นตัวเลขที่เป็นกำลังของสอง ในการแทนค่าไบนารีของตัวเลขนั้นจะเป็น MSb คือ 1 และบิตอื่นๆ ทั้งหมดจะเป็น 0 ดังนั้นหากเราดำเนินการ [n AND (n – 1)] ค่านี้จะกลับมา 0 ถ้า n เป็นกำลังของ 2 หากเราเห็น n =16 =10000 ในรูปเลขฐานสอง (n – 1) =15 =01111 ในเลขฐานสอง ดังนั้น 10000 AND 01111 =00000 =0
ตัวอย่าง (C)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <stdio.h> #include <math.h> #define MAX 20 bool isPowerOfTwo(int n){ return(n>0 && !(n & (n-1))); } int main() { printf("%s\n", isPowerOfTwo(16) ? "true" : "false"); printf("%s\n", isPowerOfTwo(12) ? "true" : "false"); printf("%s\n", isPowerOfTwo(1) ? "true" : "false"); printf("%s\n", isPowerOfTwo(32) ? "true" : "false"); printf("\n"); }
อินพุต
16 12 1 32
ผลลัพธ์
true false true true