JAVA基礎1——字節&位運算


占用字節數 & 取值范圍

Java一共有8種基本數據類型(原始數據類型):

類型            存儲要求               范圍(包含)                默認值              包裝類
int           4字節(32位)          -2^31~ 2^31-1                  0               Integer
short         2字節(16位)          -215~215-1                     0               Short
long          8字節(64位)          -2^63~2^63-1                   0               Long
byte          1字節(8位)           -2^7~2^7-1                     0               Byte
float         4字節(32位)          -3.4e+38 ~ 3.4e+38            0.0f             Float
double        8字節(64位)          -1.7e+308 ~ 1.7e+308           0               Double
char          2字節(16位)          u0000~uFFFF(‘’~‘?’)         ‘0’              Character 
boolean       1/8字節(1位)          true, false                  FALSE             Boolean

對於float與double類型:

內存結構:

  1. float類型: 內存中共占4個字節,32bit位,其中bit位從高到低,依次是1位符號位、8位指數位、23位尾數位;
  2. double類型:內存中共占8字節,64bit位,其中bit位從高到低,依次是1位符號位、11位指數位、52位尾數位;

精度:
精度由尾數的位數決定,在內存中按照科學計數法的方式存儲的。

關於比較是否相等:

  1. 兩個浮點數之間不能通過來比較是否相等,因為浮點數的精度是有限制的,超過精度限制的浮點數,計算機會將精度之外的小數部分截斷,如果直接比較的話,會出現兩個不一樣的值結果大小判斷卻相等的情況。
  2. 一般情況下,不要通過==或者!=來比較,可以通過判斷其差值的絕對值是否大於0來判斷。
  3. 實際應用中,一般兩個浮點數之間的差值的絕對值小於等於某一個可接受的誤差(即:精度,比如0.00000001),就認為是相同的。

實際應用原則:

  1. 程序中盡量避免浮點型數據的比較;
  2. float、double類型運算一般都不准確,只適合科學計算或者工程計算,不適用與商業計算。比如1.0f-0.9f=0.100000024

為了解決JAVA中浮點數精度不夠的問題,可以使用BigDecimal來替代,適用於對精度要求較高的系統中。


源碼 & 反碼 && 補碼##

源碼

源碼就是數字對應的二進制表示。

負數的源碼 = 正數的源碼取反再加1

反碼

正數的反碼就是源碼自身。

負數的反碼就是:保持源碼符號位不變,其余各個位取反。

補碼

正數的補碼就是源碼自身。

負數的補碼就是: 反碼基礎上加1

如何根據補碼計算源碼:

  1. 最高位如果是0,即為正數,其補碼即為源碼;
  2. 最高位如果是1,即為負數,對此補碼再次計算補碼,結果即為源碼(即:補碼的補碼即為源碼)。

為什么要有源碼、反碼、補碼

反碼、補碼存在主要是為了是計算機運算更加方便。
具體可以參見http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html


運算符

根據參與運算的參數個數,可以分為下面幾種:

  1. 一元運算符:就是只需要一個參數的運算,比如++、--、~、!等;
  2. 二元運算符:就是需要2個參數的運算,比如+、-、*、>、<等;
  3. 三元運算符:就是需要3個參數的運算,比如?:運算符(isTrue ? A : B)。

位運算相關

JAVA中的位運算符有下面幾種:

  1. 左移(<<)、右移(>>)、無符號右移(>>>)
  2. 位與(&)、位或(|)、位非(~)、位異或(^)

1. 位與####

參加運算的兩個數據,按二進制位進行位與運算.

例如:3&5

  • 先將兩個數據轉化為二進制數,然后按位進行與運算,同為1結果為1,其它情況結果為0;
  • 即:11&101=001結果為1

特別提醒:負數按補碼形式參加按位與運算

位與運算的特殊用途:

  1. 清零(將一個單元與0進行位與運算結果為零)
  2. 取一個數中指定位(例如取X=1010 1101的低四位 則將X&00001111得到0000 1101)。

2. 位或####

參加運算的兩個數據,按二進制位進行位或運算

例如:3 | 5

  • 先將兩個數據轉化為二進制數,然后進行按位或運算,只要有一個是1結果為1,不然結果為0;
  • 即:11&101=111結果為7

特別提醒:負數按補碼形式參加按位或運算

位或運算的特殊用途:

常用來對數據的某些位置1(例如將X=1010 1010的第四位置1,則將X |0000 1111得到1010 1111)。

3. 位非####

快速計算結果的方法:

a的值為-(a+1)。比如2=-3,~(-2)=1

具體計算說明:

位非操作實際上是對計算機的補碼進行操作的。 即:先源碼轉補碼,然后對補碼進行逐位取反,最后再將處理后的補碼轉回源碼

  1. 根據二進制源碼獲取其補碼;
  2. 對補碼進行按位取反;
  3. 將計算后的補碼轉換回源碼。

對於正整數,其補碼與源碼相同,對於負數,其補碼位源碼的取反再加一

4. 位異或####

參加運算的兩個數據,按二進制位進行位異或運算

例如:3^5

  • 先將兩個數據轉化為二進制數,然后進行按位異或運算,只要位不同結果為1,不然結果為0;
  • 即:11^101=110結果為6

異或運算的特殊用途:

  1. 使特定位翻轉找一個數,對應X要翻轉的各位,該數的對應位為1,其余位為零,此數與X對應位異或即可。例:X=10101110,使X低4位翻轉,用X ^0000 1111 = 1010 0001即可得到。
  2. 與0異或得到原值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM