iT邦幫忙

3

【c/c++學習筆記】位元運算(>>與<<)的使用

c++

今天要來介紹c/c++中的兩個位元運算子>><<
如果沒接觸過程式的朋友可能會覺得很困惑,
>是大於,<是小於,
那麼>><<是什麼東東?
難道是「遠大於」跟「遠小於」嗎?

位元運算: 左移運算子(<<)與右移運算子(>>)

事實上,>><<是位元運算子,
可以用來將一個數字的二進位表示法,
向左移動或向右移動幾個位數

譬如說十進位的5表示二進位數字的101
那麼5<<2就是二進位的10100,即十進位的20
5>>1就是二進位的10,即十進位的2

那這種運算子有什麼用途呢?
簡單的用處是:「加速」

x<<1相當於x*2,x>>1相當於x/2

我們發現,x<<1相當於x*2,x>>1相當於x/2,
由於位元運算只需要把數字往前、後移動,
位元運算的速度是比一般乘法還要快很多的

好比說我們在做十進位的乘法時,
想要把一個數字「乘以10」就把數字後面補上一個0,
做「除以10」就把數字後面擦掉一個0一樣,
所以「乘以10」和「除以10」的計算會比一般乘法還要快

做二進位乘法要「乘以2」和「除以2」也是類似,
就把數字左移(在二進位中補0)或右移(在二進位中擦掉0)就行了

其它常用位元運算子「~」、「&」、「|」、「^」 介紹

除了>><<之外,還有這幾個是常見的位元運算子

運算子 說明
~ 位元運算NOT
& 位元運算AND
| 位元運算OR
^ 位元運算XOR

由於這些運算子用法較為基礎,
不想在文中贅述,
可參考邏輯運算、位元運算的教學

活用這些位元運算子,可以達到許多效率上的加速,
底下介紹一些常用的用法

參考題目

例如本題就是一個使用位元運算的例子: d326: 程式設計師的面試問題(二)

應用、將第b個bit設成1

/* set bit b to 1 */
int set_bit(int v, int b)
{
    return v | (1<<b);
}

應用、將第b個bit設成0

/* set bit b to 1 */
int set_bit(int v, int b)
{
    return v & ~(1<<b);
}

應用、檢查第b個bit是0還是1

/* check_bit b is 1 or 0 */
int check_bit(int v, int b)
{
    return v & (1<<b)?1:0;
}

應用、印出一個整數的二進位表示法

在c語言中,我們可以用printf直接印出一個int的十六進位的表示法,
例如:

int i=200;
printf("%x", i);

但c語言並無法直接印出一個int的二進位的表示法,
要怎麼自己寫程式印出二進位呢?

我們可以利用上述寫的check_bit函數,
判斷整數的二進位表示法的各個位數是0還是1即可,
完整程式範例如下:

#include <stdio.h>

/* check_bit b is 1 or 0 */
int check_bit(int v, int b)
{
    return v & (1 << b) ? 1 : 0;
}

//印出整數v的二進位表示法
void printBinary(int v)
{
    for (int i = 31; i >= 0; --i)
        printf("%d", check_bit(v, i));
    putchar('\n');

}

int main(void)
{
    printBinary(200);
    return 0;
}

尚未有邦友留言

立即登入留言