成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

想看懂源碼必須會的位邏輯運算符

開發 前端
位運算符這塊個人覺得還是挺復雜的,還是需要不斷的加深學習和理解。這里強調一點,位運算計算后,不會影響值得本身,比如 int a=5; ~a; 這個a本身并沒有改變。另一方面,位運算的效率是遠遠大于直接計算的。

?概述

最近在看jdk一些集合的框架的時候,頻繁出現位運算,比如下圖,這對我閱讀源碼產生了很大的阻礙,因為我對這塊內容也是一知半解,因為很少用過,即便學過基本也還給老師了,這篇文章主要針對java中的位運算做一個總結。

圖片

位運算符介紹

在Java語言中,提供了7種位運算符,分別是按位與(&)、按位或(|)、按位異或(^)、取反(~)、左移(<<)、帶符號右移(>>)和無符號右移(>>>)。位運算符是對long、int、short、byte和char這5種類型的數據進行運算的,我們不能對double、float和boolean進行位運算操作。

位運算符只要是正對二進制的數據進行操作,由于java中最終是按照補碼的方式存儲的,至于為什么按照補碼的方式,是另外一個話題了,按下不表。

正數的原碼和反碼、補碼一樣。負數的反碼:把原碼的符號位保持不變,數值位逐位取反,即可得原碼的反碼。負數的補碼:在反碼的基礎上加 1 即得該原碼的補碼。

位邏輯運算符

位邏輯運算符有以下4種,按位與(&)、按位或(|)、按位異或(^)、取反(~)。

位與(&)運算符

位與運算符為&,運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位同時為 1,那么計算結果才為 1,否則為 0。因此,任何數與 0 進行按位與運算,其結果都為 0,最左邊的符號位也是要參與運算的。

圖片

例子:5&6

圖片

首先把5和6這兩個數字轉換為補碼,之后還要把這兩個數字按位對齊,然后一一把兩個相應的二進制位上的數字進行按位與運算,運算得到的二進制串就是最終的結果。

通過位與運算符特點推導出如下結論:

  1. 任何數與 0 進行按位與運算,其結果都為 0

位或(|)運算符

位或運算符為|,其運算規則是:參與運算的數字,低位對齊,高位不足的補零。如果對應的二進制位只要有一個為 1,那么結果就為 1;如果對應的二進制位都為 0,結果才為 0。

圖片

例子: 5|6

圖片

首先還是把這兩個數字轉換成補碼形式,之后把相應的二進制位上的數字進行按位或運算:如果兩個二進制數都是0,計算結果為0,其他情況計算結果均為1。按照這個規則把每一位上的數字都計算一遍后,得到二進制的運算結果是111,這個運算結果轉換為十進制數是7。

通過位或運算符特點推導出如下結論:

  1. 任何數與 0 進行按位或運算,其結果都是它本身
  2. 任何數與 位數都是1的二進制進行按位或運算,其結果的二進制位數都是1

位異或(^)運算符

位異或運算符為^,其運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位相同(同時為 0 或同時為 1)時,結果為 0;如果對應的二進制位不相同,結果則為 1。

圖片

例子:5^6

圖片

同樣是先轉成補碼,然后異或計算,得到最后的二進制結果11,轉成十進制為3。

通過異或運算符特點推導出如下結論:

  1. 異或運算符滿足交換律,a^b與b^a是等價的。
  2. 任何兩個相同的數字進行異或操作,所得到的結果都必然為0。
  3. 對于任意一個二進制位來說,這個位上的數與0進行異或運算,運算結果與這個二進制位上的數是相同的,而與1進行異或運算,結果與這個二進制位上的數字相反。
  4. 對于任何兩個整數a和b,a^b^b等于a, 對于任何兩個整數a和b,a^b^a等于b

位取反(~)運算符

位取反運算符為~,其運算規則是:只對一個操作數進行運算,將操作數二進制中的 1 改為 0,0 改為 1。

例子:對數字5取反

圖片

首先把數字5轉換成補碼形式,之后把每個二進制位上的數字進行取反,如果是0就變成1,如果1就變成0,經過取反后得到的二進制串就是運算結果,此時是補碼的形式,需要轉回原碼,符號位為1,其余各位取反,然后再整個數加1, 這個運算結果被還原為十進制數是-6。

注意:位運算符的操作數只能是整型或者字符型數據以及它們的變體,不用于 float、double 或者 long 等復雜的數據類型。

位移位運算符

位移相關的運算符有三個,分別是左移(<<)、帶符號右移(>>)、無符號右移(>>>)。

左移運算符

左移位運算符為<<,其運算規則是:按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。

圖片

根據左移運算符可以推導出:

  1. 左移運算有乘以2的N次方的效果。一個數向左移動1位,就相當于乘以2的1次方,移動兩位就相當于乘以2的2次方,也就是乘以4。

帶符號右移運算符

右位移運算符為>>,其運算規則是:符號位不變,按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補零。

圖片

根據帶符號右移運算符特點可以推導出:

  1. 對于正數而言,帶符號右移之后產生的數字確實等于除以2的N次方。
  2. 對于任何一個byte、short或者int類型的數據而言,帶符號右移31位之后,得到的必然是0或者是-1。對于long類型的數據而言,帶符號右移63位之后,得到的也必然是0或者是-1。

無符號右移

無符號右移運算符為>>>, 其運算規則是:無符號右移在二進制串移動之后,空位由0來補充,與符號位是0還是1毫無關系,注意這里的無符號是忽略符號位,也參與移位。

圖片

常見的位運算

  1. 計算m*2^n
System.out.println("2^3=" + (1 << 3));// 2^3=8
System.out.println("3*2^3=" + (3 << 3));// 3*2^3=24
System.out.println("5*2^3=" + (5 << 3));// 5*2^3=40
  1. 判斷一個數n的奇偶性
System.out.println((5 & 1) == 1 ? "奇數" : "偶數"); // 奇數
System.out.println((6 & 1) == 1 ? "奇數" : "偶數"); // 偶數
System.out.println((0 & 1) == 1 ? "奇數" : "偶數"); // 偶數
System.out.println((-1 & 1) == 1 ? "奇數" : "偶數"); // 奇數
System.out.println((-2 & 1) == 1 ? "奇數" : "偶數"); // 偶數
  1. 取絕對值
System.out.println((-5 ^ (-5 >> 31)) - (-5 >> 31));// 5
System.out.println((0 ^ (0 >> 31)) - (0 >> 31));// 0

4個字節 32位,a>>31取得a的符號;

任何正數右移31后只剩符號位0,溢出的31位截斷,空出的31位補符號位0,最終結果為0;

任何負數右移31后只剩符號位1,溢出的31位截斷,空出的31位補符號位1,最終結果為 -1;

正數 ^ 0 = 正數本身(二進制不變);

負數 ^ -1 = 它的絕對值 -1(二進制翻轉每一位);

總結

位運算符這塊個人覺得還是挺復雜的,還是需要不斷的加深學習和理解。這里強調一點,位運算計算后,不會影響值得本身,比如 int a=5; ~a; 這個a本身并沒有改變。另一方面,位運算的效率是遠遠大于直接計算的。


責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2017-05-11 16:38:07

javascript邏輯運算符

2009-11-18 09:37:31

PHP邏輯運算符

2009-08-12 14:23:09

C#邏輯運算符

2023-03-29 09:22:03

SQLWhere語句

2023-04-10 08:58:13

C#關系運算符

2021-06-07 06:10:22

C++While循環For 循環

2022-10-21 16:28:52

PythonGo布爾值

2009-11-18 09:19:47

PHP邏輯運算符

2009-11-26 11:12:07

PHP運算符

2025-02-24 11:16:20

2020-10-15 08:11:56

JavaScript邏輯運算符

2019-10-09 14:23:59

Python運算符代碼

2023-04-11 10:13:04

Java運算符反碼

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2020-05-06 12:24:57

NPE三目運算符

2009-08-12 10:20:52

C#位運算符

2024-06-11 14:57:00

2009-10-23 10:18:43

VB.NET運算符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线一区二区三区 | 日韩色在线 | 国产高清视频在线观看播放 | 国产在线一区二区三区 | 91精品国产91久久久久久吃药 | 免费的av网站 | 亚洲aⅴ一区二区 | 日韩精品一区在线 | 一区二区三区欧美 | 国产乱码精品一区二区三区中文 | 亚洲福利视频一区二区 | 国产精品一区二区在线 | 国产一区二区三区在线 | 久久成人精品 | 国产成人精品一区二区三 | 成人久久 | 91精品国产乱码久久蜜臀 | 日韩精品一区二区三区中文在线 | 国产精品九九九 | 国产精品永久免费视频 | 亚洲成人精品在线观看 | 亚洲一区电影 | 亚洲成人精品在线 | 亚洲一区二区三区在线播放 | 欧美一区二区三区在线 | 好姑娘高清在线观看电影 | 美女天天干天天操 | 国产精品久久精品 | 免费看a | 免费在线一区二区三区 | 亚洲区视频 | 日韩欧美国产一区二区 | 日韩在线观看网站 | 国产日韩欧美中文字幕 | 精品一区二区三区在线观看 | 亚洲成人免费 | 国产精品99久久久久久人 | 国产h在线 | 欧美一级在线观看 | 亚洲一区视频在线播放 | 亚洲精品99 |