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
運算,即將二進制位中 0
和 1
全部取反,運算方式爲:
~ 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
以此類推