日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《码出高效》个人总结1.1 二进制,按位运算

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《码出高效》个人总结1.1 二进制,按位运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

看了好多大佬的視頻,或多或少都推薦了一本《碼出高效 Java開發手冊的書》,我也跟著大佬們買了一本,就當作是讀書筆記,記錄下我看到了什么,本人比較懶,可能讀的很慢,而且記錄的可能不全,設計的知識面也很淺顯,如有錯誤或遺漏,還請讀者斧正。另外十分推薦這本書,如果是萌新的話,也不是說看不懂,但是應該十分吃力,不是特別建議使用《碼出高效》入門。

1.1 走進0與1的世界

二進制是什么,以及簡單的運算

我們學計算機的,或者準備入門的都知道,這個世界上又10種人,一個是懂二進制的,一個是不懂二進制的。那么二進制具體是什么呢?

說實話,我也沒什么自信能夠說清楚,按照我自己的話就是:二進制就是一種數字表達形式,就像日常生活中的十進制數字一樣,不過逢十進一變成了逢二進一了而已。書上的內容是:簡單的說,計算機就是晶體管,電路板組裝起來的電子設備,無論是圖形圖像的渲染,網絡遠程共享,還是大數據計算,歸根結底多是0與1的信號處理。信息存儲和邏輯計算的元數據,只能是0和1,但是它們在不同的介質里的物理表現方式卻不是一樣的,如三極管的通電和斷電、CPU的低電平和高電平、磁盤的電荷左右方向。明確了0與1的物理表現形式后,設定基數為2,進位規則是“逢二進一”,借位規則是“借一當二”,所以稱為二進制。

1 = 1、10 = 2、100 = 4、1000 = 8、11000 = 24,即2^0 = 1、2^1 = 2、2^3 = 8、2^4 + 2^3 = 24

如何表示負數?答:二進制最左側的數字表示符號位,0表示整數,1表示復數。00100011 = 35,10100011 = -35。

如果使用二進制進行運算的話,就需要了解原碼,反碼,補碼是什么。原碼就是將原數字(十進制)變成二進制的樣子,注意符號位。正數的補碼與原碼,反碼是一樣的,而負數的補碼是反碼加1的結果。(反碼對于負數來說就是原碼取反,將原來是0變成1,將1變成0,符號位保持不變)二進制運算都是使用補碼進行運算的,只有加法,但是如果加上一個負數,就變成減法了,且符號位也參加運算超出的部分不計(如 00100011 + 11011101 = 00000000,正常來說因該是100000000,但是超出部分不算,就應該舍棄得到正確結果 35+ (-35) = 0)

00100011 = +35(正35的補碼),11011101 = -35(負35的補碼)

位移運算

這是一個大家很熟悉又很陌生的操作,可能你可能聽說過,一般情況下,位移運算比乘法或者除法運算,運行的更快,但是位移運算真的就像我們印象中的那樣,是簡單的乘以2x或2x嗎?

“別人家的開發工程師”在代碼中經常使用這種操作方式進行高低位截取,哈希計算,甚至運用在乘除法運算中。向右移動1位近似表示除以2,十進制的奇數轉化為二進制數后,在向右移動中,最右邊的1將被直接抹去,說明向右移對于奇數并非完全相當于除以2。在左移<<與右移>>兩種運算中,符號位均參與移動,除負數往右移動,高位補1之外,其他情況均在空位出補0

正數/負數向左移<<1位向右移>>1位
正數(35的補碼0010001101000110 = 26+22+2^1 = 7000010001 = 24+26 = 17(近似除2)
負數(-35的補碼1101110110111010 =1(1000101+1) = -7011101110 = 1(0010001+1) = -18
正數(99的補碼0110001111000110 = -5800110001 = 49
負數(-99的補碼1001110100111010 = 5811001110 = -50

左移運算由于符號位參與向左移動,在移動后的結果中,最左位可能是1或者0,即正數向左移動的結果可能是正,也可能是負數。負數向左移動的結果同樣可能是正,也可能是負。

對于三個大于號的>>>無符號向右移動(注意不存在<<<無符號向左移動的運算方式),當向右移動時,正負數最高位均補0,正數不斷向右移動的最小值是0,而負數不斷右移的最小值是1.無符號意思為藐視符號位,符號位失去特權,必須向其他平常的數字位一起向右移動,高位直接補0,根本不關心是正數還是負數。次運算常用在高位轉低位的場景中,如下表左側為均補0.

正數/負數向右移>>>1位向右移>>>2位向右移>>>3位
正數(35的補碼 00100011)00010001 = 1700001000 = 800000100 = 4
負數(-35的補碼 11011101)01101110 = 11000110111 = 5500011011 = 27

為何負數不斷地無符號右移的最小值是1呢?在實際編程中,位移運算僅作為用于整形(32位)和長整型(64位)數上,假如在整形數上移動的位數是32位,無論是否帶符號以及移動方向,均為本身。 因為移動的位數是一個mod32的結果,即35>>1和35>>33是一樣的結果。

按位取反(符號~),按位與(符號&),按位或(符號|),按位異或(符號^)

其中,按位與(&)運算典型的場景就是獲取網段值,IP地址與掩碼255.255.255.0進行按位與運算得到最高24位,即為當前IP的網段。按位運算的左右兩邊都是整形數。true&false這樣的方式也是合法的,因為boolean底層表示也是0與1.

按位與和邏輯與(符號位&&)運算都可以作用于條件表達式,但是后者有短路功能,表達式如下:

boolean a = true; boolean b = true; boolean c = (a=(1 == 2))&&(b = (1 == 2))

因為&&前邊的條件表達式,即(a=(1 == 2))的結果位false,觸發短路,直接退出,最后a的值位false,b的值位true。假如把&&變成&,則執行的結果a和b都是false。同樣邏輯或(||)也具有短路功能。

邏輯或,邏輯與運算只能針對布爾類型的條件表達式進行運算,7&&8這種運算表達式是錯誤的。

異或運算沒有短路能力,符號在鍵盤的數字6上方,在哈希算法中用于離散哈希值,**對應的位上不一樣才為1,**比如:1^1 = 0、1^0 = 1、0^0 = 0、0^1 = 1

以上就是閱讀《碼出高效》1.1的個人總結的內容,知識還蠻多的,但是在書上只有兩頁,我竟然妄圖一下午看完,真的是蜉蝣撼大樹,不自量力。

總結

以上是生活随笔為你收集整理的《码出高效》个人总结1.1 二进制,按位运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。