Java基本类型
类型 |
描述 |
Byte |
表示-128~127之间的整形数值,在内存中占据一个字节(8位二进制位) |
Short |
表示-32768~32768之间的整形数值,在内在中占据2个字节(16位二进制位) |
Int |
在内在中占据4个字节(32位二进制位) |
Long |
在内在中占据8个字节(64位二进制位) |
Char |
在内存中每个字符占16位,所有字符都用Unicode编码存储 |
按位操作:
在java中有4个可用来位操作的位运算符:
符号 |
说明 |
& |
与,1与1为1,1与0为0,0或0为0 |
| |
或,1或1为1,1或0为1,0或0为0 |
^ |
异或 |
~ |
非,对每个二进制位的内容求反,即1变0,0变1. |
移位操作:
符号 |
说明 |
<< |
左移动,右侧填充0 |
>> |
右移动,左侧扩充符号位 |
>>> |
右移动,左侧填充0 |
按位对整数变量操作的另一种技巧是移动,向右移动二进制数字相当于除以2的幂次方,向左移动二进制数字相当于乘以2的幂次方.
例如:
数值3:它是0011,向左移动一位就相当于乘以2,二进制变为0110,也就是6了.向右移动一位就是相当于除了2,二进制变为0001,
移位运算符
包括:
“>> 右移”;“<< 左移”;“>>> 无符号右移”
例子:
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。
-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。
5>>3=0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0000
其结果与 5/(2*2*2) 完全相同。
5<<3=40
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0010 1000
其结果与 5*2*2*2 完全相同。
-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111
无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1。
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
//int转byte例子
String hex = Integer.toHexString( i & 0xFF);
int 的長度是 4Bytes, & 是 and 運算子,就是將
每個位元拿來進行 and 運算,根據 and 運算的規則
只有兩者皆為 true (1) 的結果才為 1
假設這個 i 是 12345 => 0x3039 (Hex)
i & 0xFF
0x3039=>0011000000111001(Bin)
0xFF =>0000000011111111
____________________________
結果:0000000000111001
由於前面的 bits 都是 0 ,所以實際上有用的只有後面的 8 bits