關於一些位運算的小記

2022-03-29 00:58:19 字數 1058 閱讀 8763

對於位運算完全不熟悉,因此開個小記來陸續記錄一些遇到的常用位運算

```&```:按位與,對應的二進位制位均為1時返回1,否則返回0;

```|```:按位或,對應的二進位制位有乙個為1時返回1,否則返回0;

```^```:按位異或,對應的二進位制位不同時返回1,否則返回0;

```~```:按位非,對每一位取反;

```<<```:左移;

```>>```:右移;

##位運算的一些技巧

###```i<>j```

前者表示i的二進位制表示左移j位,等效於i/(2^j);後者表示i的二進位制表示右移j位,等效於i*(2^j);

###i&1

求i的最後一位,可判斷奇數偶數;

###i^j

比較i與j的每一位,不同時返回1,否則返回0;因此i==j時,i^j=0;

###i&(-i)

返回 i 的二進位制數表示為1的最低位的權值,如1001則返回1,1100則返回4,1110則返回2;該運算常用於求和或更新樹狀陣列

###i&(i-1)

使i二進位制表示下最右邊的1變為0;

因此:①可以用i&(i-1)的結果是否為0來判斷i是否是2的冪;

②如果要比較m,n的二進位制表示有多少位不同,可以

```c++

int n,m,t,cnt=0;

cin >> n>>m;

t = n ^ m;

while (t)

cout << cnt;

```n^m的結果將n與m的不同位變為1,相同位變為0,因此只需統計t有多少個1;

用t&(t-1)來依次將t最右邊的1改為0,直到t為0;操作的次數即為1的個數。

由此統計m,n不同位的個數

###i+((i+1)&(-(i+1)))

i+1將i最低位的0變為1,後面的1變為0,再用(i+1)&-(i+1)取得其最低位1的權值,加到i上,得到的效果就是將i最低位的0變成1

###異或運算的一些性質

異或運算的逆運算也是異或運算,即:a^b=c,則有a=b^c;

異或運算具有結合律,因此a^b^b=a

一些位運算

該篇文章會持續更新將遇到的位運算在這進行解釋 1.按位與 運算 運算規則 0 0 0 0 1 0 1 0 0 1 1 1 例如 8的二進位制 00001000 5的二進位制 00000101 8 5 0000 0000 轉換成十進位制就是0 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其...

位運算的一些操作

按位與 操作通常用作將乙個數的某些位清零或保留某些位操作 例如 把a的高8位清零 a 0000000011111111 也就是將a 255操作之後,就會實現將數字a的高8位位清零了 異或 操作的用途 將某些特定的位翻轉 例如對數0x10100001的第2和第3位翻轉操作,那麼 可以0x1010000...

位運算的一些基本操作

原部落格 一 邏輯運算子 1.位與運算 1 運算規則 位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。例如 int型常量4和7進行位與運算的運算過程如下 4 0000 0000 0000 0100 7 0000 0000 0000 0111 0000 0000 0000 ...