/*
位运算符:
& 按位与
| 按位或
^ 按位异或
~ 按位反
<< 左移
>> 右移
>>> 无符号右移
为什么要讲位运算符?
因为数据在底层都是通过位运算计算的,JDK7的源码在很多地方使用位运算。
方便将来看懂JDK7的源码。
后面我们可以做做JDK源码中常见类的类源码分析与讲解。
*/
public class Demo01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 4;
int b = 3;
System.out.println(a & b);//0
System.out.println(a | b);//7
System.out.println(a ^ b);//;7
System.out.println(~a);//-5
}
}
/*
位运算符的规则:0假1真
& 按位与 如果操作时同时为1,则结果为1。
| 按位或 如果操作时同时为0,则结果为0。
^ 按位异或 如果操作数据不同,则为1,相同则为0。
~ 按位反 把所有的数据都0变化1,1变化为0.
我们看到这种结果,不猜,自己计算。
在自己计算之前,我们得做一些基础知识普及。
A:我们应该知道位运算符参与运算,是bit参与,其实也就是二进制数据参与运算。
B:我们就必须把数值变化为二进制参与运算。
C:把4和3的二进制做出来。
4和3本身都是十进制的数据,所以应该用32个bit位表示,但是为了讲课方便,我还是继续采用1个byte表示,也就是8个bit位:
4的二进制:0 0000100
3的二进制:0 0000011
D:& 按位与 如果操作时同时为1,则结果为1。
0 0000100
&0 0000011
----------
0 0000000 -- 对应的十进制的值是:0
E:| 按位或 如果操作时同时为0,则结果为0。
0 0000100
|0 0000011
----------
0 0000111 -- 对应的十进制的值是:7
F:^ 按位异或 如果操作数据不同,则为1,相同则为0。
0 0000100
^0 0000011
----------
0 0000111 -- 对应的十进制的值是:7
G:~ 按位反 把所有的数据都0变化1,1变化为0.
把4的二进制写出来,为了讲课方便我们用一个byte表示。
0 0000100
~操作后。
1 1111011
这个值其实是一个补码,又由于最高位是1,所以,我们知道该数据是负数。
所以,我们应该得到改数据的原码。
补码:1 1111011
反码:1 1111010
原码:1 0000101
符号位 5
-5
*/
/*
<< 左移运算符 右边空出来的补齐0,左边最高的去掉了。
>> 右移运算符 左边空出来数据,补齐和最高位相同的数值。
>>> 无符号右移运算符 左边空出来数据,都补齐0。
*/
public class Demo02
{
public static void main(String[] args)
{
System.out.println(2<<2);//8
System.out.println(3<<4);//3*2^4-48
System.out.println(16>>2);//16/(2^2)=4
System.out.println(64>>3);//64/(2^3)=8
}
}
/*
首先,我们要知道,位运算符操作的使用,需要把十进制数据转换成二进制数据。
既然是这个样子,那么,我们就把2的二进制写出来。
由于2默认是int类型的数据,所以,用32bit表示
原来的数据:00000000 00000000 00000000 00000010
移动两位:
(00)000000 00000000 00000000 0000001000 对应的十进制是8
想想我们的十进制:
如果我是一个个位的数据3,向左边移动一位,就变成了30,就相当于扩大了10倍。
同理,我们可以得出这样的一个结论,任意进制的数据往左边移动1位,就相当于扩大了
改数据的进制倍数。
我们这里的二进制往左边移动1位,就扩大了2倍。
如果是移动2位,就扩大多少倍呢?
应该是2^移动位数的次幂倍。
2<<2 -- 2*2^2
同理:我们可以得到一个结论是:
右移动,就是除以2的多少次幂。
*/
Java基础—位运算
最新推荐文章于 2022-08-28 11:30:28 发布