java基础语法5
java学习路线Day06
一、位运算符
示例:
public class WeiOptDemo1 {
public static void main(String[] args) {
int a =3;
int b =4;
System.out.println(a & b);
System.out.println(a | b);
System.out.println(a ^ b);
System.out.println( ~ b);
}
}
位运算是直接对二进制进行运算。
计算机中所有的数据运算都是采用补码的形式进行的
这段程序的计算过程如下:
3的原码:00000000 00000000 00000000 00000011 —>3的补码
4的原码:00000000 00000000 00000000 00000100 —>4的补码
位运算
& : 按位计算,有0则0
结果: 00000000 00000000 00000000 00000000 —>0
| :有1则1
结果 : 00000000 00000000 00000000 00000111 —>7
^ : 相同则0,不同则1
结果: 00000000 00000000 00000000 00000111 —>7
~ :1变成0,0变成1
结果: 11111111 11111111 11111111 11111011
此为补码,转成原码:
10000000 00000000 00000000 00000101 —> -5
结果:
注意:&,| , ^ ,这三个既是逻辑运算符,又是位运算符。怎么区分呢?
看符号两边的数据类型,两边都是boolean类型,那就是逻辑运算,计算结果也是boolean类型。两边是数值类型的值,那就是位运算,输出也是数值类型。
除了&,| , ^ 这三个位运算符,还有 <<(左移),>>(右移),>>>(无符号右移) 三个位运算符,示例:
public class WeiOptDemo2 {
public static void main(String[] args) {
System.out.println(2<<3);
System.out.println(24>>3);
System.out.println(-24>>3);
System.out.println(-24>>>3);
计算过程:
左移 | |
---|---|
2的补码: | 00000000 00000000 00000000 00000010 |
左移三位,左边删掉三位,右边空位补0 | ( |
正数右移 | |
24的补码: | 00000000 00000000 00000000 00011000 |
右移三位,右边删掉三位,左边空位补符号位上的数字 | 000 00000 00000000 00000000 00000011( |
负数右移 | |
-24的原码: | 10000000 00000000 00000000 00011000 |
-24的补码: | 11111111 11111111 11111111 11101000 |
右移三位,右边删掉三位,左边空位补符号位上的数字 | 111 11111 11111111 11111111 11111101( |
无符号右移 | |
-24的补码: | 11111111 11111111 11111111 11101000 |
右移三位,右边删掉三位,左边不管符号位是啥,统一补0 | 000 11111 11111111 11111111 11111101( |
总结:
<<: 左移,相当于乘以2的多少次幂
>>:右移,相当于除以2的多少次幂
注意:
无符号右移时,操作数为正数,和右移结果相同,操作数为负数,与右移结果不同!
二、三目运算符
语句定义格式:
(关系表达式)?表达式1:表达式2;
如果()内条件为true,运算后的结果是表达式1;
如果()内条件为false,运算后的结果是表达式2;
示例:
public class SanMuOptDemo1 {
public static void main(String[] args) {
//判断两个数最大值
int a=10;
long b=5L;
// int c=(a>b)?a:b;//java: 不兼容的类型: 从long转换到int可能会有损失
long c=(a>b)?a:b;
System.out.println(c);//10
注意事项:
1.三目运算符一定是有一个结果值的
2.三目运算符表达式中,最终的结果数据类型是由参与运算的最大的数据类型决定的,所以上面的示例结果虽然是10,但不能用int接收。
比较三个数大小:
int a=3;
int b=4;
int c=5;
int d=(a>b)?((a>c)?a:c):((b>c)?b:c);
System.out.println(d);