long int和short與byte之間的轉化

2021-07-29 21:54:37 字數 3447 閱讀 1478

技術點:

計算機中儲存是用補碼!!,同時注意一下計算省略了高位不變部分

1、byte:有符號(意思是有正和負),在網路傳輸中都是會用到byte的,它佔1個位元組,共8位,比如說11111111就可以用1個byte表示,轉化為10進製:- (2的6次+2的5次+2的4次+2的3次+2的2次+2的1次+2的0次) = -127。其中前7位表示數字,最高位表示符號,0為正,1為負。範圍是 (-2的7次 ~ 2的7次 - 1),那為什麼前面最小是-127,範圍最小又是-128呢?因為規定-0(10000000)為-128。

2、short:有符號,佔2個位元組,共16位。同byte一樣,它的取值範圍就是 (-2的15次 ~ 2的15次 - 1)。

3、int :有符號,佔4個位元組,共32位。它的取值範圍就是(-2的31次 ~ 2的31次)。

4、long:有符號,佔8個位元組,共64位,它的取值範圍就是(-2的63次 ~ 2的63次)。

5、^:表示異或位運算,兩者相同則為0,兩者不同則為1。比如說15^2,15用二進位制表示就是1111,2用2進製表示就是0010,兩者進行異或運算,結果就是1101,轉換為十進位制就是13。ab

a^b110

1010

1100

0 6、|:表示或運算,兩者只有有乙個為1就為1, 比如說13|2,13用二進位制表示就是1101,2用二進位制表示就是0010,兩者進行或運算,那麼結果就是1111,轉換為十進位制就是15。ab

a或b111

1010

1100

0 7、&:表示與運算,兩者都為1就為1,其餘都為0,比如說15&2, 13用二進位制表示就是1111,2用二進位制表示就是0010, 兩者進行與運算,那麼結果就是0010,轉換為十進位制就是2。ab

a&b111

1000

1000

0 8、~:取反,就是本來是0變成1,本來是1變成0。a~b

1001

注意本來我打算不想解釋這塊的,但是學知識,既然要學了,就盡自己最大努力一次性乙個知識點學透徹。我舉個例子,比如說-15|3等於多少呢?有些人會覺得-15轉化為二進位制就是10001111,而3轉化為二進位制就是00000011,那麼結果應該是10001111呀,轉換為十進位制就是-15呀?大家可以自己寫個demo就會發現是不對的。要注意在計算機中所有的都是用補碼的形式儲存的,之所以上面介紹兩個正數是對的,因為正數的反碼和補碼都是一樣的。而負數求補碼應該是出去符號位取反+1,我們再來看看這個題-15|3,其中-15的原碼為10001111,反碼為11110000,那麼補碼就是11110001,然後3的補碼為00000011,兩者進行或操作就是11110011,你以為結束了麼?還沒有,再又要求它的原碼了,原碼就是補碼再求補碼再+1(是不是已經暈掉了?),也就是10001101,結果就是-13。為了大家都好理解,我這裡用算式整理一下

求 -15|3

[-15]原碼 = 10001111

[-15]反碼 = 11110000 //原碼求反碼符號位不變

[-15]補碼 = 11110001 //反碼+1等於補碼

[3]原碼 = 00000011

[3]反碼 = 00000011 //正數都一致

[3]補碼 = 00000011 //正數都一致

-15|3 = 11110011 //兩個補碼進行或操作

[結果]補碼 = 11110011 //上面求得的值

[結果]反碼 = 10001100 //符號位不變

[結果]原碼 = 10001101 //反碼+1

100001101 轉化為十進位制就是-13。

不知道我這麼解釋會不會更加清楚一些呢?同理的,上面那些(尤其是求反『~』我故意沒寫例子,大家自己去試試吧)。

在說一次,正數的原碼,補碼,反碼都一樣,如果一定要說為什麼一樣,我就舉個例子。有這麼乙個等式7+(-7)=0。

我們知道

[-7]原 = 10000111

[-7]反 = 11111000

[-7]補 = 11111001

那麼如果要存在乙個值和[-7]補碼相加等於0,是不是就是00000111!!所以正數的補碼和原碼是一致的。這樣解釋雖然怪怪的,但是可以知道的確是這樣的。

9、<<:左移運算子,不需要考慮符號位,因為在後面補0,把二進位制的數字向左移動,低位補0。比如說 3<<2。3的二進位製碼為11,向左移動2位就是1100,那麼結果就是12。

10、>>:右移運算子,帶符號位。根據這個要移動的數字決定正負,如果是正數,那麼就在前面補0,如果是負數就在前面補1。比如說 3>>2,3的二進位製碼為00000011,向右移動2位,就變成00000000,轉化為十進位制就是0了(3是正數所以在高位補0)。再比如說-3>>2,-3的二進位製碼為10000011,轉化為補碼(只要涉及到負數,就需要轉換到補碼計算,正數之所以不用轉化,是因為他們的補碼和原碼是一致的)11111101,進行位移運算,就是11111111,這個是補碼,需要再轉回原碼。那麼就是取反+1,結果就是10000001,轉化為十進位制就是-1。

11、>>>:右移運算子,與上面的區別就是這個運算子是無符號的。不論正負,高位都補0。如果要用-3>>2來驗證,因為高位補0,就需要把所有的位數都寫全了。如果是int,那就要寫成32位來運算。切記切記。上面很多因為高位的變化「取反再取反」會導致前面所有的位都沒變所以我就簡化了,但是這個》運算子不行哦,它會把負數變為正數。

基本步驟:

①分析轉化和代轉化之間位數的關係

②計算偏移量。每次都取最後8位

③把最後8位和0xff進行&操作

④得出結果。

有人會問,為什麼要和0xff進行&操作?這裡我做一下解釋,因為再在割的時候,我們要保證最後8位是一致的,更高位都要置0,這樣才能保證資料的一致性。比如說由byte轉化成short。位數從8位變成了16位,那麼在計算機自己看來,它會把前面多出來的8位置1。而&0xff就可以把前面所有的位數都置0。

1、short 與 byte互相轉化

public

static

byte short2byte(short s)

return b;

}public

static

short

byte2short(byte b)

return l;

}

2、int和byte的轉化也差不多

public

static

byte int2byte(int s)

return b;

}public

static

intbyte2int(byte b)

return l;

}

那麼long和byte的轉化,甚至是long和short等之間的轉化大家自己琢磨。看到這裡是不是覺得自己要學的東西很多,大學學過的都忘記了呢?沒關係,以後我會經常給大家複習一些重要但是不常用的東西哦。

BigDecimal與Long int之間的互換

在實際開發過程中bigdecimal是乙個經常用到的資料型別,它和int long之間可以相互轉換。int 轉換成 bigdecimal 資料型別 int 轉換成 bigdecimal型別 public static void inttobigdecimal lont 轉換成 bigdecimal ...

BigDecimal與Long int之間的互換

在實際開發過程中bigdecimal是乙個經常用到的資料型別,它和int long之間可以相互轉換。int 轉換成 bigdecimal 資料型別 int 轉換成 bigdecimal型別 public static void inttobigdecimal lont 轉換成 bigdecimal ...

int與short之間的轉換

寫的乙個int轉short的類 前些時間做藍芽.標準的藍芽類沒法建資料流,後來就出現了只能傳送byte可是我們的程式中資料型別有很多,所以必要做轉化.這裡做了個int轉short的方法.public classtest system.out.println true public static sh...