摘要:位運算和無符號位運算對于負數而言,普通位運算已然保持了符號位,而是將真值部分進行位運算。大數向小數的溢出問題直接進行位運算,默認輸出值的類型為等小數將會自動擴充成進行位運算,則使用位位運算。
原碼、反碼和補碼
一個數可以分成符號位(0正1負)+ 真值,原碼是我們正常想法寫出來的二進制。由于計算機只能做加法,負數用單純的二進制原碼書寫會出錯,于是大家發明了反碼(正數不變,負數符號位不變,真值部分取反);再后來由于+0, -0的爭端,于是改進反碼,變成補碼(正數不變,負數符號位不變,真值部分取反,然后+1)。二進制前面的0都可以省略,所以總結來說:計算機里的負數都是用補碼(符號位1,真值部分取反+1)表示的。
位運算和無符號位運算
對于負數而言,普通位運算已然保持了符號位1,而是將真值部分進行位運算。但要注意對于負數的位運算操作是建立在補碼上的(補碼運算,得到補碼結果,將補碼結果轉換為普通的10進制數結果),所以就會出現-15 >> 1 得到的是-8 而不是 -7.而無符號位運算則是將負數的補碼整個一起位移,并且高位補0,這就意味著將高位符號位補0變成了正數,所以最后往往得到一個很大的值,即Integer.MAX_VALUE - x.x為該負數的絕對值進行位運算后得到的結果。
大數(long 64,int 32)向小數(short 16,byte 8)的溢出問題
直接進行位運算,默認輸出值的類型為int.short, byte等小數將會自動擴充成int進行位運算,long則使用64位位運算。如果強制大數向小數轉換,就會出現溢出,原大數真值中的1變成了小數里代表符號位的1而成為了負數。
最后就是位運算在刷題里遇到的不多,有時候那種純數字的問題不能用乘法除法的話就可以考慮位運算了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67587.html
摘要:原碼補碼和反碼原碼一個數在計算機中是以二進制的形式存在的,其中第一位存放符號正數為負數為。中的位運算在中按位操作符會將其操作數轉成補碼形式的有符號位整數。原文鏈接由扯到中的位運算 這個話題的由來是2016年3月份的時候 NPM 社區發生了‘left-pad’事件,不久后社區就有人發布了用來補救的,也是現在大家能用到的 left-pad 庫。 最開始這個庫的代碼是這樣的。 module....
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
閱讀 2110·2023-04-26 02:41
閱讀 2154·2021-09-24 09:47
閱讀 1560·2019-08-30 15:53
閱讀 1215·2019-08-30 13:01
閱讀 1895·2019-08-29 11:27
閱讀 2870·2019-08-28 17:55
閱讀 1781·2019-08-26 14:00
閱讀 3394·2019-08-26 10:18