摘要:位運(yùn)算和無符號(hào)位運(yùn)算對(duì)于負(fù)數(shù)而言,普通位運(yùn)算已然保持了符號(hào)位,而是將真值部分進(jìn)行位運(yùn)算。大數(shù)向小數(shù)的溢出問題直接進(jìn)行位運(yùn)算,默認(rèn)輸出值的類型為等小數(shù)將會(huì)自動(dòng)擴(kuò)充成進(jìn)行位運(yùn)算,則使用位位運(yùn)算。
原碼、反碼和補(bǔ)碼
一個(gè)數(shù)可以分成符號(hào)位(0正1負(fù))+ 真值,原碼是我們正常想法寫出來的二進(jìn)制。由于計(jì)算機(jī)只能做加法,負(fù)數(shù)用單純的二進(jìn)制原碼書寫會(huì)出錯(cuò),于是大家發(fā)明了反碼(正數(shù)不變,負(fù)數(shù)符號(hào)位不變,真值部分取反);再后來由于+0, -0的爭(zhēng)端,于是改進(jìn)反碼,變成補(bǔ)碼(正數(shù)不變,負(fù)數(shù)符號(hào)位不變,真值部分取反,然后+1)。二進(jìn)制前面的0都可以省略,所以總結(jié)來說:計(jì)算機(jī)里的負(fù)數(shù)都是用補(bǔ)碼(符號(hào)位1,真值部分取反+1)表示的。
位運(yùn)算和無符號(hào)位運(yùn)算
對(duì)于負(fù)數(shù)而言,普通位運(yùn)算已然保持了符號(hào)位1,而是將真值部分進(jìn)行位運(yùn)算。但要注意對(duì)于負(fù)數(shù)的位運(yùn)算操作是建立在補(bǔ)碼上的(補(bǔ)碼運(yùn)算,得到補(bǔ)碼結(jié)果,將補(bǔ)碼結(jié)果轉(zhuǎn)換為普通的10進(jìn)制數(shù)結(jié)果),所以就會(huì)出現(xiàn)-15 >> 1 得到的是-8 而不是 -7.而無符號(hào)位運(yùn)算則是將負(fù)數(shù)的補(bǔ)碼整個(gè)一起位移,并且高位補(bǔ)0,這就意味著將高位符號(hào)位補(bǔ)0變成了正數(shù),所以最后往往得到一個(gè)很大的值,即Integer.MAX_VALUE - x.x為該負(fù)數(shù)的絕對(duì)值進(jìn)行位運(yùn)算后得到的結(jié)果。
大數(shù)(long 64,int 32)向小數(shù)(short 16,byte 8)的溢出問題
直接進(jìn)行位運(yùn)算,默認(rèn)輸出值的類型為int.short, byte等小數(shù)將會(huì)自動(dòng)擴(kuò)充成int進(jìn)行位運(yùn)算,long則使用64位位運(yùn)算。如果強(qiáng)制大數(shù)向小數(shù)轉(zhuǎn)換,就會(huì)出現(xiàn)溢出,原大數(shù)真值中的1變成了小數(shù)里代表符號(hào)位的1而成為了負(fù)數(shù)。
最后就是位運(yùn)算在刷題里遇到的不多,有時(shí)候那種純數(shù)字的問題不能用乘法除法的話就可以考慮位運(yùn)算了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67587.html
摘要:原碼補(bǔ)碼和反碼原碼一個(gè)數(shù)在計(jì)算機(jī)中是以二進(jìn)制的形式存在的,其中第一位存放符號(hào)正數(shù)為負(fù)數(shù)為。中的位運(yùn)算在中按位操作符會(huì)將其操作數(shù)轉(zhuǎn)成補(bǔ)碼形式的有符號(hào)位整數(shù)。原文鏈接由扯到中的位運(yùn)算 這個(gè)話題的由來是2016年3月份的時(shí)候 NPM 社區(qū)發(fā)生了‘left-pad’事件,不久后社區(qū)就有人發(fā)布了用來補(bǔ)救的,也是現(xiàn)在大家能用到的 left-pad 庫。 最開始這個(gè)庫的代碼是這樣的。 module....
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點(diǎn)數(shù)的形式儲(chǔ)存,但是做位運(yùn)算的時(shí)候,是以位帶符號(hào)的整數(shù)進(jìn)行運(yùn)算的,并且返回值也是一個(gè)位帶符號(hào)的整數(shù)。如下表應(yīng)用場(chǎng)景取整對(duì)于一般的整數(shù),返回值不會(huì)有任何變化。例如,結(jié)果為負(fù)數(shù)存儲(chǔ)采用的形式是二進(jìn)制補(bǔ)碼。 什么是位運(yùn)算? 位運(yùn)算是在數(shù)字底層(即表示數(shù)字的 32 個(gè)數(shù)位)進(jìn)行運(yùn)算的。由于位運(yùn)算是低級(jí)的運(yùn)算操作,所以速度往往也是最快的(相對(duì)其它運(yùn)算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點(diǎn)數(shù)的形式儲(chǔ)存,但是做位運(yùn)算的時(shí)候,是以位帶符號(hào)的整數(shù)進(jìn)行運(yùn)算的,并且返回值也是一個(gè)位帶符號(hào)的整數(shù)。如下表應(yīng)用場(chǎng)景取整對(duì)于一般的整數(shù),返回值不會(huì)有任何變化。例如,結(jié)果為負(fù)數(shù)存儲(chǔ)采用的形式是二進(jìn)制補(bǔ)碼。 什么是位運(yùn)算? 位運(yùn)算是在數(shù)字底層(即表示數(shù)字的 32 個(gè)數(shù)位)進(jìn)行運(yùn)算的。由于位運(yùn)算是低級(jí)的運(yùn)算操作,所以速度往往也是最快的(相對(duì)其它運(yùn)算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點(diǎn)數(shù)的形式儲(chǔ)存,但是做位運(yùn)算的時(shí)候,是以位帶符號(hào)的整數(shù)進(jìn)行運(yùn)算的,并且返回值也是一個(gè)位帶符號(hào)的整數(shù)。如下表應(yīng)用場(chǎng)景取整對(duì)于一般的整數(shù),返回值不會(huì)有任何變化。例如,結(jié)果為負(fù)數(shù)存儲(chǔ)采用的形式是二進(jìn)制補(bǔ)碼。 什么是位運(yùn)算? 位運(yùn)算是在數(shù)字底層(即表示數(shù)字的 32 個(gè)數(shù)位)進(jìn)行運(yùn)算的。由于位運(yùn)算是低級(jí)的運(yùn)算操作,所以速度往往也是最快的(相對(duì)其它運(yùn)算如加減乘除來說),并...
摘要:反碼正數(shù)的反碼就是本身。負(fù)數(shù)的反碼是二進(jìn)制保留符號(hào)位。作用是對(duì)運(yùn)算符兩側(cè)以二進(jìn)制表達(dá)的操作符按位分別進(jìn)行與運(yùn)算。則完整的運(yùn)算式為無符號(hào)右移一位。 java中對(duì)二進(jìn)制的操作符 &、|、^、~、>>、>幾個(gè)位操作符。不管是初始值是依照何種進(jìn)制,都會(huì)換算成二進(jìn)制進(jìn)行位操作。接下來對(duì)這幾種操作符進(jìn)行一下簡(jiǎn)單的解說。 先說一下基礎(chǔ)知識(shí): 原碼 就是當(dāng)前數(shù)字的二進(jìn)制表現(xiàn)形式,如-1的原碼是1000...
閱讀 2169·2023-04-26 02:41
閱讀 2189·2021-09-24 09:47
閱讀 1596·2019-08-30 15:53
閱讀 1253·2019-08-30 13:01
閱讀 1927·2019-08-29 11:27
閱讀 2902·2019-08-28 17:55
閱讀 1831·2019-08-26 14:00
閱讀 3495·2019-08-26 10:18