逍遙自在學C語言 | 位運算子&的高階用法

知微之見發表於2023-04-10

前言

在上一篇文章中,我們介紹了&運算子的基礎用法,本篇文章,我們將介紹& 運算子的一些高階用法。

一、人物簡介

  • 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。

  • 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。

二、位掩碼

  • 位掩碼是一種用於按位操作的技術

  • 它透過使用一個二進位制數(掩碼)來遮蔽或保留目標數中的一些特定位

  • 例如,如果要將一個無符號整數的最高位清零,可以使用以下程式碼:

#include <stdio.h>

int main()
{  
	unsigned int x = 0xABCD1234; //0b10101011110011010001001000110100
	x &= ~(1U << 31);
 
    printf("x = %u\n",x);
	return 0;
}
  • 1U << 31 表示將一個無符號整數的最高位設定為 1
  • ~(1U << 31)取反得到掩碼,再和原數進行按位與運算,就可以將最高位清零

三、判斷奇偶性

二進位制末尾位
奇數 1
偶數 0
  • 一個數的二進位制表示中,如果最後一位為 1,則它是奇數,否則它是偶數
  • 因此,可以使用 & 運算子來判斷一個數的奇偶性,例如:
#include <stdio.h>
int main()
{
    int x = 7;
    if (x & 1) 
    {
        printf("%d 是奇數\n", x);
    } 
    else 
    {
        printf("%d 是偶數\n", x);
    }
    return 0;
}
  • x & 1 將返回 x 的最後一位與 1 的按位與
  • 如果結果為 1,說明 x 是奇數,否則 x 是偶數。

四、判斷是否為 2 的冪次方

  • 如果一個數是 2 的冪次方,那麼它的二進位制表示中,只有最高位為 1,其他位都為 0
  • 把這個數減去1,那麼它的二進位制表示中,最高位為 0,其他位都為1
  • x & (x - 1)的結果一定為 0
  • 例如,判斷16 是否是 2 的冪次方:
#include <stdio.h>
int main()
{
    unsigned int x = 16;
    if (!(x & (x - 1))) 
    {
        printf("%u 是 2 的冪次方\n", x);
    } 
    else 
    {
        printf("%u 不是 2 的冪次方\n", x);
    }
    return 0;
}

小結

透過這篇文章,我們學會了用位運算子&來做位掩碼操作、判斷奇偶性、判斷一個數是否為2的冪次方。

在下一篇文章中,我們將介紹位運算子|的幾個高階用法。

相關文章