1 基本数据类型
Java基本类型共有八种:字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。
简单类型 | boolean | byte | char | short | Int | long | float | double |
---|---|---|---|---|---|---|---|---|
二进制位数 | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 |
最大存储数据量 | / | 256 | / | 65536 | 2^32 | 2^64 | / | / |
数据范围 | / | -128~127 | / | -216~ 216-1 | -231~231-1 | -264~264-1 | / | / |
封装器类 | Boolean | Byte | Character | Short | Integer | Long | Float | Double |
Java提供的位运算符有:左移(<<)、右移(>>) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
2 位运算
2.1 左移( << )
5<<2
0000 0000 0000 0000 0000 0000 0000 0101 左移2位,正负数低位都补0:
0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20,变大了2^2倍
2.2 右移( >> )
5>>2
0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
0000 0000 0000 0000 0000 0000 0000 0001 换算成10进制为1,精度损失
-5>>2
1111 1111 1111 1111 1111 1111 1111 1011 然后右移2位,负数高位补1:
1111 1111 1111 1111 1111 1111 1111 1111 换算成10进制为-1,精度损失
2.3 无符号右移( >>> )
-5>>>3
1111 1111 1111 1111 1111 1111 1111 1011 然后右移2位,无符号高位补0:
0001 1111 1111 1111 1111 1111 1111 1111 换算成10进制为536870911
2.4 位与( & )
5&13 = 5
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 1101
每位与运算,转化为:
0000 0000 0000 0000 0000 0000 0000 0101
2.5 位或( | )
5|13 = 13
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 1101
每位或运算,转化为:
0000 0000 0000 0000 0000 0000 0000 1101
2.6 位异或( ^ )
5^13 = 8
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 1101
每位比较,相同为0,不同为1,转化为:
0000 0000 0000 0000 0000 0000 0000 1000
2.7 位非( ~ )
~5
0000 0000 0000 0000 0000 0000 0000 0101 取反
1111 1111 1111 1111 1111 1111 1111 1010
3 leetcode例题练习
题目:371 两整数之和 不适用 + - 实现加法.
用位运算模拟加法器
在不考虑进位的情况下,其无进位加法结果为 a ^ b。
而所有需要进位的位为a & b,进位后的进位结果为(a & b) << 1。
class Solution {
public int getSum(int a, int b) {
while (b != 0) {
int carry = (a & b) << 1;
a = a ^ b;
b = carry;
}
return a;
}
}