【1】Java中int类型介绍
-
首先从Java中的int整型说起,int变量占4个字节,一个字节8位,那么int就占32位即从0位到31位。
然后在java中是没有 无符号位 的数,那么在0位到31位中,31位表示符号位,其余的表示数值。 -
那么int整型的表示的范围是多少呢?
大家在csdn一搜发现是 2的-31次方到 2的 31次方减1 那么是为什么呢?
首先由于31位是符号位 0 表示正 1表示负
那么int的最大值 的二进制 即 011111.。。。。11111 也就是2的31次方-1
那么负数的最小值呢?
这里有个规定:负数的表示规则是 符号位 为1 其余位 取反 加 1 (这里都是二进制的)
举例:-5的二进制
那么5的32位的二进制为:00000000000000000000000000000101
那么-5的32位的二进制先让符号位为1然后后面的全部取反 即为:11111111111111111111111111111011
那么负数的最小值即为正数的最大值的相反数 也就是 -2的31次方-1
2的31次方-1:01111111111111111111111111111111
对它取反加1:10000000000000000000000000000000
因此在int整型了 它的最小值 为负的2的31次方
【2】Java中位运算
- 左移运算:value<<num
1)数值value向左移动num位,左边二进制位丢弃,右边补0。(注意byte和short类型移位运算时会变成int型,结果要强制转换)
2)若1被移位到最左侧,则变成负数。
3)左移时舍弃位不包含1,则左移一次,相当于乘2。 - 右移运算:value>>num
1)数值value向右移动num位,正数左补0,负数左补1,右边舍弃。(即保留符号位)
2)右移一次,相当于除以2,并舍弃余数。
3)无符号右移>>>:左边位用0补充,右边丢弃
【3】如何将十进制数转化为2进制数打印出来
思路:用 与 & 运算实现
与 & 运算原理:只有 两个1 相遇才会是1 其余都为0。
在进行 与运算时,先将十进制数转换为2进制数 然后就行比较。
因此下面用一个for循环从1左移31位 依次左移30位 左移29位 一个一个的与 num比较
举例 假如1左移10 位是 1024 那么在进行与运算时,先换成2进制即 1 0000 0000 00 然后与num换成2进制比较
只有当num的二进制在10位值是1的时候,才打印出来1 否则为0
因此循环32次 将0位置到31位置 都与 num的二进制位置比较 即可 打印出 num的 2进制
- 代码:
public class Code06_PrintB {
/*
* 将一个十进制数输出为32位状态的2进制:
* 【注】int类型占4个字节,一个字节八位,那么int占32位
* 思路:用 与 & 运算实现
* 与 & 运算原理:只有 两个1 相遇才会是1 其余都为0。在进行 与运算时,现将十进制数转换为2进制数 然后就行比较。
* 因此下面用一个for循环从1左移31位 依次左移30位 左移29位 一个一个的与 num比较
* 举例 假如1左移10 位是 1024 那么在进行与运算时,先换成2进制即 1 0000 0000 00 然后与num换成2进制比较
* 只有当num的二进制在10位值是1的时候,才打印出来1 否则为0
* 因此循环32次 将0位置到31位置 都与 num的二进制位置比较 即可 打印出 num的 2进制
* */
public static void print(int num) {
for (int i = 31; i >= 0; i--) { //循环32次
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
public static void main(String[] args) {
int test = 10;
print(test);
int a = Integer.MAX_VALUE;
int c = Integer.MIN_VALUE;
print(a);
print(c);
}
}