位运算
>>> 无符号右移,第一位符号位不变,其他位用0补齐
>> 右移,整体右移,左边的用0补齐
<< 左移,整体左移,右边的用0补齐
| 或:有1则1
& 与:有0则0
^ 异或:相反为1,否则为0
~ 取反:
写个测试
1.5以后的jdk中,Integer等数字类型内部维护了一个成员变量叫 SIZE
,以Integer为例:
/**
* The number of bits used to represent an {@code int} value in two\'s
* complement binary form.
*
* @since 1.5
*/
@Native public static final int SIZE = 32;
可以看出,Integer的长度是32位。下面是测试代码:
/**
* 打印int数据的二进制
*
* @param num int
*/
private static void printBit(int num) {
for (int i = 31; i >= 0; i--) {
int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果结果是0,则打印0,否则打印1
System.out.print(i1 == 0 ? \"0\" : \"1\");
}
System.out.println(\"\");
}
下面开始位运算:
public class BitOperationTest {
/**
* 打印int数据的二进制
*
* @param num int
*/
private static void printBit(int num) {
for (int i = 31; i >= 0; i--) {
int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果结果是0,则打印0,否则打印1
System.out.print(i1 == 0 ? \"0\" : \"1\");
}
System.out.println(\"\");
}
public static void main(String[] args) {
int i = 10;
System.out.println(\"i : 10\");
printBit(i);
int leftMove = i << 3;
System.out.println(\"leftMove : \");
printBit(leftMove);
int rightMove = i >> 3;
System.out.println(\"rightMove : \");
printBit(rightMove);
int unsignRightMove = i >>> 3;
System.out.println(\"unsignRightMove : \");
printBit(unsignRightMove);
System.out.println(\"===========\");
System.out.println(\"i : 10\");
printBit(i);
int j = -10;
System.out.println(\"j : -10\");
printBit(j);
int or = i | j;
System.out.println(\" i | j : \");
printBit(or);
int and = i & j;
System.out.println(\"i & j : \");
printBit(and);
int xor = i ^ j;
System.out.println(\" i ^ j : \");
printBit(xor);
int neg = ~ i;
System.out.println(\" ~ i : \");
printBit(neg);
}
}
运行结果如下:
反码、补码
在上图可以看出,-10的二进制是 11111111111111111111111111110110
,这里做个解释。
第一位是符号位,0表示正数,1表示负数。先对这个二进制数取反,得到 00000000000000000000000000001001
,这就是反码 ,然后在反码的基础上+1,得到 补码 :00000000000000000000000000001010
,这个数就是二进制的10,然后加上符号位,即-10。
Java各基础数据长度
看下Integer中的代码:
/**
* The number of bits used to represent an {@code int} value in two\'s
* complement binary form.
*
* @since 1.5
*/
@Native public static final int SIZE = 32;
/**
* The number of bytes used to represent a {@code int} value in two\'s
* complement binary form.
*
* @since 1.8
*/
public static final int BYTES = SIZE / Byte.SIZE;
可知Integer的二进制长度为32位,有四个字节。
类型 | 二进制长度 | 字节数 | 范围 |
---|---|---|---|
byte | 8 | 2 | -128~127 |
short | 16 | 4 | -32768~32767 |
int | 32 | 8 | -2^31 ~ 2^31-1 |
long | 64 | 16 | -263~263-1 |
char | 16 | 4 | 0~65535 |
代码地址
我的征途,是星辰大海!
来源:https://www.cnblogs.com/javac-xinghejun/p/16227862.html
本站部分图文来源于网络,如有侵权请联系删除。