2018-04-06-bit-operation

title layout excerpt categories tags
位運算符與位運算
post
編程中位運算的介紹與應用
編程
位運算 按位運算

目錄

一、概述

程序中的所有數在計算機內存中都是以二進制的形式儲存的。除了常見的算術運算符+ - * / %,還有位運算& | ^ ~ >> <<,就是直接對整數在內存中的二進制位進行操作。接下來以C語言爲例介紹,其它語言大同小異。

二、按位與(&)

又叫 and 運算,用符號 & 表示,計算方式如下:

1 & 1 = 1 , 0 & 1 = 0 , 0 & 0 = 0

布爾類型中,1 表示真,0 表示假,所以可以用高中數學那句話來記:同真爲真,一假爲假

舉個例子:3 & 5 = 1 ,運算過程如下:

   0 1 1   ---> 3
 & 1 0 1   ---> 5
  --------
   0 0 1   ---> 1

三、按位或 (|)

又叫 or 運算,用符號 | 表示,運算方式:

1 | 1 = 1 , 1 | 0 = 1 , 0 | 0 = 0

記爲:一真爲真,同假爲假

舉例:3 | 5 = 7 , 運算過程:

   0 1 1   ---> 3
 | 1 0 1   ---> 5
 --------
   1 1 1   ---> 7

四、按位異或(^)

又叫 xor 運算,用符號 ^ 表示,注意這裏不是數學表達裏面的次方的意思,運算方式:

1 ^ 1 = 0 , 1 ^ 0 = 1 , 0 ^ 0 = 0

這種運算也較爲特殊,記爲:同爲假,異爲真 舉例:3 ^ 5 = 6 , 運算過程:

   0 1 1    ---> 3
 ^ 1 0 1    ---> 5
 ---------
   1 1 0    ---> 6

簡單應用

1、交換變量值

異或運算有如下特性:

a ^ b ^a = b , a ^ b ^ b =a

因此可以用於程序中的變量值交換,C語言中,我們可能經常這樣交換變量值:

#include <stdio.h>
int main()
{
	int a = 3, b = 5;
	int temp; /*定義一個臨時變量用於交換方便*/
	temp = a;
	a = b;
	b = temp;
	printf("a = %d, b = %d", a, b); /*輸出結果爲:a = 5, b = 3 實現了變量值的交換*/
}

但是以後我們可以這樣實現:

#include <stdio.h>
int main()
{
	int a = 3, b = 5;
	a ^= b; /*等同於:a = a ^ b 之後會講*/
	b = a ^ b; /*這時 a ^ b 等於 原來 a 的值*/
	a ^= b; /*a = a ^ b*/
	printf("a = %d, b = %d", a, b);
}

a, b 爲負數時同樣適用,但位運算只適用於整型,浮點數不可用

2、簡單加密

例如,你想傳輸一條信息給Ta,信息爲:5201314 ,密碼爲:1998 ,使用如下代碼加密:

5201314 ^ 1998

結果爲 5200492,想要查看原信息,使用密碼查看:

5200492 ^ 1998

這樣就生成了原數字:5201314.

五、按位取反(~)

又叫 not 運算,即將二進制位中 01 全部取反,運算方式爲:

~ 1 = 0 , ~ 0 = 1

記爲:0 變 1,1 變 0

舉例:~5 = -6, 運算過程:

 ~ 00000000 00000000 00000000 00000101   ---> 5
 ---------------------------------------
   11111111 11111111 11111111 11111010   ---> -6

注意變量如果定義是無符號短整型 unsigned short~5 將不再是 -6 ,而是 65530還有一個規律是正整數取反後結果是原數加一後取相反數,負數一樣還要注意不要和邏輯運算符 ! 搞混,! 1 = 0 , ! 1234 = 0 , ! 0 = 1,即只有 真(1)假(0) 兩種。

六、移位運算

顧名思義,移位即將數據的二進制數進行向左或向右平移一定的位數,然後得到新的數據,移位分爲左移位和右移位。

1、左移位(<<)

將數據的轉換爲二進制,所有位向左平移,高位(左端)捨棄,低位(右端)空位補 0,格式爲:

需要移位的數據 << 需要移動的位數

舉例:5 << 2 =20 ,運算過程:

  00000000 00000000 00000000 00000101   ---> 5
 -------------------------------------
  00000000 00000000 00000000 00010100   ---> 20

右移位的數學意義是,原數左移 n 位,相當於原數乘以 2 的 n 次方

2、右移位

將數據的二進制所有位向右移位,低位捨棄,高位補 0(負數補 1),格式:

需要移位的數據 >> 需要移動的位數

舉例:5 >> 2 = 1,運算過程:

  00000000 00000000 00000000 00000101   ---> 5
 -------------------------------------
  00000000 00000000 00000000 00000001   --->  1

負數情況:-6 >> 2 = -2,運算過程:

  11111111 11111111 11111111 11111010    ---> -6
 -------------------------------------
  11111111 11111111 11111111 11111110    ---> -2

右移位的數學意義是,相當於原數除以 2 的 n 次方

七、複合賦值符

算術運算中有複合賦值符:+= -+ *= /= %=,位運算也有對應的複合賦值:&= |= ^= >>= <<= (注意沒有 ~= ),運算一樣:

a &= b 等價於 a = a & b

以此類推


返回頂部

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章