逻辑运算 运算符两侧为boolean类型,运算的结果也必须是boolean类型的值
& 逻辑与,单与运算
当运算两侧都为true时,结果为true,否则为false。
| 逻辑或,单或运算
当两侧都为false时结果为false,否则为true。
^ 逻辑异或
当两侧相同时(同为true或者同为false),结果为false,否则结果为true。
&& 双与运算
当运算两侧都为true时,结果为true,否则为false。
双与和单与的区别: 双与运算当左侧为false时,右侧的表达式不参与运算。
|| 双或
当两侧都为false时结果为false,否则为true。
对于双或而言,当两侧为true时,右侧不参与运算。
! 非运算
非true为false 非false为true
位运算 指得是二进制数位运算
& 按位与运算
运算规律:当相同的二进制数位上都为1时,与的结果就为1,否则为0.
| 按位或运算
运算规律:当相同的二进制数位上都为0时结果为0,否则为1.
^ 按位异或运算
运算规律:当相同的二进制数位上数据相同时,结果为0,否则为1.
应用:对同一个数异或两次,得到是原来的数。可以用于加密。
练习:交换两个数
使用第三方变量
不使用第三方变量交换两个空间中的值,可以使用加减法完成。但是,当数据过大时,会发生数据溢出。
溢出解决方案: 使用按位异或运算代替。
class Test1
{
public static void main(String[] args)
{
int a = 4;
int b = 5;
a = a^b;
b = a^b;
a = a^b;
System.out.println("a="+a+",b="+b);
}
}
取反 ~
<< 左移符号 高位移出的舍弃,低位用0补。
当对一个整数向左移动N位时,相当于给原数乘以2的N次方(注意N为N%32的值,N=33相当于移动N的1次方)数据过大时,此规律不适用。
>> 右移符号
带符号右移,最高位补的数取决于原有数据最高位是什么。不带符号的右移,则不管最高位是什么都补0.
当对一个整数向右移动N位时,相当于给原数除以2的N次方(注意N为N%32的值,N=33相当于移动N的1次方)数据过大时,此规律不适用。
>>> 无符号右移
练习:
需求: 给定的整数60,获取其十六进制数位的表现形式
思路: 1,十六进制它是怎么来的
按照每四个二进制数位为一组,把它转成一个十六进制数位。
2,怎么取出二进制数中的四个二进制位上的数。要取出4位。原二进制数与上1111,取出最低的那4个二进制位上的数据。
3,上述方式只能取出最低的那4个二进制数位上的数据,接下来怎么取出其他? 可以使用无符号右移,对原来的数据向右移动4位,在进行第二步。
步骤: 1,需要一个变量存放这个整数,
2,对这个数据进行&运算,
3,打印这个数
4,对原数无符号右移4位
5,对移动后的新值再进行&运算
6,打印这个值
三元运算符(三目运算)
一元运算:运算符一侧有数据
二元运算:算术运算 逻辑运算 关系运算
格式: (表达式1)?表达式2 : 表达式3;
例: max=a<b ? b : a ;
运算原则: 1) 表达式一的运算结果必须为boolean类型的值
2) 当表达式一的结果为true时,表达式2的运算结果就为整个三元运算符的结果。
3)当表达式1的结果为flase时,表达式3的运算结果就为整个三元运算符的结果。
class Noname1
{
public static void main(String[] args)
{
int a=4;
int b=5;
int max;
max=a<b?b:a;
System.out.println("max="+max);
}
}
判断结构(if)
第一种格式: if(条件表达式)
{
判断正确后执行语句;
}
格式说明:if关键字后面是一对小括号,小括号后面是没有分号的,小括号中的表达式运算完的结果必须是boollean类型的值。
第二种格式: if()
{
判断正确后执行语句;
}
else
{
判断不成立后执行的语句;
}
三元运算可以称为if-else简化形式。但有前提,如果if-else执行后有具体的结果,就可以使用三元运算代替它。否则无法代替。
练习:
需求:对给定的1~7的一个数,输出其对应的星期。
思路:
1,需要判断当前这个数据具体是几。可以使用if判断结果来实现。
2,判断成立后,需要输出对应的星期
步骤:
1,需要定义变量,存储当前这个数据。
2,判断当前这个数据具体是几
判断结构的第三种情况:
if(判断的条件表达式)
{
}
else if()
{
}
else if()
{
}
。。。。。
作业:
需求:根据指定的月份,输出对应的季节。
春季 3 4 5
夏季 6 7 8
秋季 9 10 11
冬季 12 1 2
class Test4
{
public static void main(String[] args)
{
int month = 13;
if(month >= 3 && month <= 5)
System.out.println("春季");
if(month >= 6 && month <= 8)
System.out.println("夏季");
if(month >= 9 && month <= 11)
System.out.println("秋季");
if(month == 12 || month == 1 || month == 2)
System.out.println("冬季");
else
System.out.println("火星的季节");
}
}
switch(多分枝结构)
格式:
switch(表达式) 计算的结果只能为byte short int char
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
。。。。
default :
执行语句;
break;
}
switch的执行流程:
jvm会先计算switch表达式的值,使用这个值和case后面的值做对比。当某一个case身后的值和表达式的值匹配,就会执行当前这个case身后的语句。若,case身后的语句没有break,此时会继续往下执行,直到switch语句结束。
default 和 case 是程序的入口。
default:
System.out.println("E");
case 2:
System.out.println("B");
break;
编译结果为 E B ,因为default语句没有break语句,jvm从入口进去后,没有遇到break,会继续运行,直到遇到break。
if结构和switch结构的区别
1,表达式的结果类型不同
if(判断的条件表达式 boolean类型值)
switch(具体数据类型 byte short int char 枚举 String)
2,功能上的差异
if 能判断区间
switch只能是具体值
switch练习:
需求:相对成绩进行划分
90--100 A
80--89 B
70--79 C
60--69 D
60以下 E
思路:
1,使用switch结构,switch只能判断确切的值
怎么把区间变成确切值?
2,发现区间是有规律:
90 - 99 可以使用9代替
。。。。
循环结构
while语句
格式: while(循环的条件表达式)
{
执行语句;
}
|