- 位运算符
位操作是程序设计中对位模式按位或二进制的一元和二元操作.
在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多.
在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).
-位运算符都有哪些
Java中提供了如下几个位运算符:
& : 按位与 | : 按位或 ~ : 取反
^ : 按位异或 << : 左移 >> : 右移
其中除了~(取反)是单目运算符,其余都是双目运算符
-位运算符都代表什么意思
& : 代表参与运算的两数各对应的二进位相与.
只有对应的两个二进位均为1时,结果才为1,否则为0.
1&1=1 0&0=0
0&1=0 1&0=0
所谓的位运算符,说白了就是两个数转换为二进制形式一位一位的算.
比如:5&6 的结果是4.
那么这个4是咋来的嘞?
5的二进制是0101
6的二进制是0110
前面也说了&代表只有两个数同时为1时才是1,
5&6 --> 0b0101 & 0b0110 --> 0b0100(0b代表二进制形式)
| : 代表参与运算的两数各对应的二进位相或.
只有对应的两个二进位均为0时,结果才为0,否则为1.
1&1=1 0&1=1
0&0=0 1&0=1
比如:5 | 6 的结果就是7.
详细的就不说了跟上面那个&一样
^ : 代表参与运算的两数各对应的二进位相异或.
只有对应的两个二进位不相同时,结果才为1,否则为0.
1&1=1 0&1=0
0&0=1 1&0=0
比如:5 | 6 的结果就是3.
详细的就不说了跟上面的一样
5<<3 : 代表5的二进制位全部左移动3位.
比如:5 << 3 - - >0000 0000 0000 0101向左移动3位 - - > 0000 0000 0010 1000 - - >就是十进制的40.
简单记法:5<<3 - - > 5乘以2的3次方
5>>1 : 代表5的二进制位全部右移动1位.
比如:5 >> 1 - - >0000 0000 0000 0101向左移动3位 - - > 0000 0000 0000 0010 - - >就是十进制的2.
简单记法:5<<1 - - > 5除2的1次方
注意:Java中int类型的数相除的结果时商,没有小数部分
~ : 按位取反的时候,计算机会将操作数所对应的二进制表达式的每一位进行取反计算,取反所得到的值就是按位取反的结果.
比如~5 : 5的二进制表达式为 : 0000 0000 0000 0000 0000 0000 0000 0101
取反后 : 1111 1111 1111 1111 1111 1111 1111 1010,即得到结果为-6.
补充一下: 5为int数占4个字节 :
5的原码 : 0000 0000 0000 0000 0000 0000 0000 0101
取反后 : 1111 1111 1111 1111 1111 1111 1111 1010
最高位是0代表正数是1代表负数,(比如十进制的134,1在百位,即1就是最高位)
所以求原始数据:再次取反然后加1(符号位不变)得到如下结果
1000 0000 0000 0000 0000 0000 0000 0110 - - > 最高位是1所以是负数,所以十进制的结果为 : -6.
Java中还有一个叫逻辑运算的
逻辑与 &,逻辑或|,逻辑异或^, 逻辑非!
短路与&&,短路或||
简单的说一下吧 :
逻辑与& : 是两边都为真结果才是真,是布尔(boolean)类型的
比如 :
`boolean b;
b = true & true; //b的结果为true
b = false & true; //b的结果为false
b = true & false; //b的结果为false
b = false & false; //b的结果为false`
逻辑或| : 是两边都为假结果才是假,是布尔(boolean)类型的
比如 :
`boolean b;
b = true | true; //b的结果为true
b = false | true; //b的结果为true
b = true | false; //b的结果为true
b = false | false; //b的结果为false`
逻辑异或^ : 是两边相同就为假,不同就为真,是布尔(boolean)类型的
比如 :
`boolean b;
b = true ^ true; //b的结果为false
b = false ^ true; //b的结果为true
b = true ^ false; //b的结果为true
b = false ^ false; //b的结果为false`
逻辑非! : !a,结果和a的结果正好相反,是布尔(boolean)类型的
比如 :
`boolean a = true;
a = !a; //a的结果就变成了false`
短路与&&,短路或||,结果和&,|的结果一样,
区别就在于
短路与&& : 两边结果只有一个结果为false时,就判定结果为false,没必要将所有表达式都执行一遍,比如false && true 左边结果为false右边就不再执行,就直接判定结果为false.
短路或|| : 两边结果只有一个结果为true时,就判定结果为true,没必要将所有表达式都执行一遍,比如true && false 左边结果为true右边就不再执行,就直接判定结果为true
每天一点点,每天都是饱满充实的一天,加油!!!