计算机中位运算的一些性质与技巧
目錄
一、位運(yùn)算總共有5總運(yùn)算:
二、每種運(yùn)算都有相應(yīng)的性質(zhì):
三、位運(yùn)算基礎(chǔ)上擴(kuò)展的一些解法
在實(shí)際中,由于計(jì)算機(jī)采用的是二進(jìn)制存儲(chǔ),所以關(guān)于位運(yùn)算的操作能夠?qū)崿F(xiàn)并簡(jiǎn)化很多復(fù)雜問題。
一、位運(yùn)算總共有5總運(yùn)算:
與(&)、或(|)、異或(^)、左移(<<)、右移(>>)。
二、每種運(yùn)算都有相應(yīng)的性質(zhì):
1.與:都真才真。任何數(shù)與0相與都為0,任何數(shù)與1相與都為其本身;
2.或:都假才假。任何數(shù)與0相或都為其本身,任何數(shù)與1相或都為1;
3.異或:任何數(shù)與1異或得到其相反數(shù),任何數(shù)與0異或得到其本身,任何數(shù)與自身異或結(jié)果為0;
(1)交換律: A ^ B = B ^ A
(2)結(jié)合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由結(jié)合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
所以異或能完成數(shù)之間的交換以及排除偶次重復(fù):
//a與b的交換 a = a ^ b; // a = 3 ^ 7 b = a ^ b; // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3 完成b = a a = a ^ b; // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7 完成a = b // 常規(guī)方法:通過二次循環(huán)找出不重復(fù)的數(shù)字 for (...) {for (...) {...} }// 異或方法:將所有整數(shù)異或,出現(xiàn)偶數(shù)次的整數(shù)會(huì)被抵消,最終留下不重復(fù)整數(shù)。 int result = 0; for (int index = 0; index < numArray.length; index++) {result = result ^ numArray[index]; } return result;4.左移與右移
效率比乘除高,但是要注意一點(diǎn):
在二分法中,求中點(diǎn)的時(shí)候,不能(left+right)>>2;因?yàn)橹苯酉嗉涌赡芤绯?#xff0c;最好用下面的方式。
int left, right, mid; mid = left + (right - left)/2;三、位運(yùn)算基礎(chǔ)上擴(kuò)展的一些解法
1.統(tǒng)計(jì)一個(gè)數(shù)中1的個(gè)數(shù):
while(n){n = n&(n-1);++res; } return res;比如兩個(gè)數(shù)的漢明距離,可以先異或再統(tǒng)計(jì)1的個(gè)數(shù)
class Solution { public:int hammingDistance(int x, int y) {//先異或得到結(jié)果n//統(tǒng)計(jì)結(jié)果n中1的個(gè)數(shù) n與n-1位與一次能消除掉n最右邊的1int n = x^y;int res = 0;while(n){n = n&(n-1);++res;} return res;} };?
總結(jié)
以上是生活随笔為你收集整理的计算机中位运算的一些性质与技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法——贝叶斯公式的推导过程
- 下一篇: C++去掉字符串首尾的特殊字符(比如空格