移位 位與 或 異或 非

2022-09-10 19:45:25 字數 2875 閱讀 3890

j**a位運算子有:左移( << )、右移( >> ) 、無符號右移( >>> ) 、位與( & ) 、位或( | )、位非( ~ )、位異或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

原碼:乙個整數,按照絕對值大小轉換成的二進位制數,稱為原碼。

00000000 00000000 00000000 00000101   是5的原碼
反碼:將二進位制數按位取反,所得的新二進位制數稱為原二進位制數的反碼。即:1變0; 0變1

11111111 11111111 11111111 11111010   是5的反碼
補碼:反碼加1稱為補碼。

11111111 11111111 11111111 11111011   是5的補碼
在學習位移之前,我們先了解負數二進位制的表示,你可能聽過兩種不同的回答。

一種是教科書,它會告訴你:計算機用「補碼」表示負數。例如上面5的補碼:11111111 11111111 11111111 11111011表示-5

另一種是一些程式設計師告訴你的:用二進位制數的最高位表示符號,最高位是0,表示正數,最高位是1,表示負數。這種說法本身沒錯,可是如果沒有下文,那麼它就是錯的。至少它不能解釋,為什麼字元型別的-1用二進位制表示是「1111 1111」(16進製為ff);而不是我們更能理解的「1000 0001」。(為什麼說後者更好理解呢?因為既然說最高位是1時表示負數,那1000 0001不是正好是-1嗎?

其實對於計算機來說沒有正負二進位制之分,比如乙個8位的二進位制1111 1001,即可以表示-7,也可以表示249,最終得到的結果是正是負取決於開發者本人如何定義這個變數(資料的型別,比如int,unsigned,long,double等等),如果你定義的是乙個負值,則補碼先減1得到反碼1111 1000,然後反碼取反得到原碼0000 0111,原碼轉換二進位制為7,由於你定義的是乙個負數則新增負號得到-7返回

先看乙個例子:5左移2位

public class displacementoperatortest 

}

下面是具體操作過程(j**a整數預設int型別,二進位制為32位):

5的二進位制:

0000 0000 0000 0000 0000 0000 0000 0101

左移2位,低位補0後,得到:

0000 0000 0000 0000 0000 0000 0001 0100

換算成10進製為:20

先看乙個例子:5右移2位

public class displacementoperatortest 

}

下面是具體操作過程(j**a整數預設int型別,二進位制為32位):

5的二進位制:

0000 0000 0000 0000 0000 0000 0000 0101

右移2位,高位補0後,得到:

0000 0000 0000 0000 0000 0000 0000 0001

換算成10進製為:1

先看乙個例子:

public class displacementoperatortest 

}

下面是具體操作過程(j**a整數預設int型別,二進位制為32位):

5的二進位制:

0000 0000 0000 0000 0000 0000 0000 0101

5右移3位,高位補0後,換算成十進位制得0:

0000 0000 0000 0000 0000 0000 0000 0000

-5得二進位制:

1111 1111 1111 1111 1111 1111 1111 1011

-5右移3位,高位補1後,換算成十進位制得-1

1111 1111 1111 1111 1111 1111 1111 1111

-5無符號右移3位,高位補0後,換算成十進位制得536870911

第乙個運算元的的第n位於第二個運算元的第n位如果都是1,那麼結果的第n為也為1,否則為0

5轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0011

1轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0001

第乙個運算元的的第n位於第二個運算元的第n位 只要有乙個是1,那麼結果的第n為也為1,否則為0

5轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0011

7轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0111

第乙個運算元的的第n位於第二個運算元的第n位 相反,那麼結果的第n為也為1,否則為0

5轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0011

6轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0110

運算元的第n位為1,那麼結果的第n位為0,反之

5轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0101

-6轉換為二進位制:1111 1111 1111 1111 1111 1111 1111 1010

位運算 與 異或 移位

刷leetcode的時候,一直會遇到不用加法乘法去實現2個數的加法乘法運算,這類題目基本上就是利用位運算沒跑了,現在總結一下,題目 劍指offer65.不用加減乘除法做加法 分析 設a 7,b 5 即a 111,b 101,引入無進製和進製的概率 無進製和進製0 0000 1101 0101 101...

按位與 或 非 異或總結

位運算子有 按位與 按位或 按位異或 按位取反 優先順序從高到低,依次為 1.按位與操作 0 0 0 0 1 0 1 0 0 1 1 1 有0則0 例子 10 9 0000 1010 0000 1001 0000 1000 8 負數按補碼形式參加按位與運算 與運算 的特殊用途 1 清零。如果想將乙個...

與( ) 非( ) 或( ) 異或( )

位運算子主要針對二進位制,它包括了 與 非 或 異或 從表面上看似乎有點像邏輯運算子,但邏輯運算子是針對兩個關係運算子來進行邏輯運算,而位運算子主要針對兩個二進位制數的位進行邏輯運算。下面詳細介紹每個位運算子。1 與運算子 與運算子用符號 表示,其使用規律如下 兩個運算元中位都為1,結果才為1,否則...