赋值运算符
基本的赋值运算符 =
扩展的赋值运算符 += -= *= /= %=
注:1.扩展的赋值运算符,其实内涵强制类型转换。 b += 20; //b = (byte)(b + 20);
2.赋值运算符的是从右到左结合的
3.连续赋值的时候,在编译的时候会用初始值替代中间变量
算术运算符
A:+ - * / % ++ --
B:+的用法
a:正号
b:加法
c:字符串拼接
C: / 和 %
a:结果是整数,向0取整
* 1.0
b: 判断一个数是否是奇数
a % 2 != 0 (a & 1 == 1)
a % 2 = (a - (a / 2) * 2)
D:++和--的用法
a:使用
**单独使用
a++
++a
**参与操作使用
int b = a++;
int b = ++a;
后++ --,是先参与运算,再自增自减
前++ --,是先自增自减,再参与运算
b:底层原理
b = a++;
temp = a;
a = a + 1;
b = temp;
b = ++a;
a = a + 1;
b = a;
关系运算符
== ,!= ,< , > ,<= , >= , instanceof
关系运算符的结果是boolean类型,并且不会改变操作数的值
instanceof 是用来判断对象是否能被某个类接收
三目运算符
格式:(关系表达式) ? 表达式1 : 表达式2
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
应用:获取三个整数中的最大值(三目运算符的嵌套)
比较两个整数是否相同
自增运算符
前++,先自增,再参与运算
int b = a++;
int temp = a; // int b = a++;的实现原理,先赋值给temp,再自增
a = a + 1;
b = temp;
a = a++;
temp = a;
a = a + 1;
a = temp;
逻辑运算符
&(逻辑与)(长路与,两边都计算),&&(短路与),
|(逻辑或)(长路或,两边都计算),||(短路或)
^(异或)
!(非) (单目运算符)
操作数必须是boolean表达式
位运算符
位运算符只能对整数进行操作(char可以看做是特殊的整数)
&(按位与)
a & 0xffffffff = a;
a & 0 = 0;
|(按位或)
a | 0xffffffff = 0xffffffff;
a | 0 = a;
^(按位异或)
a ^ a = 0;
a ^ 0 = a;
a ^ b = b ^ a;
a ^ b ^ b = a;
~(按位非)
<<(左移): 空位补0,被移除的高位丢弃
>>(右移): 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,最高位补1
>>>(无符号右移)(只有无符号右移): 被移位二进制最高位无论是0或者是1,空缺位都用0补。
注意事项:
左移几位,就相当于乘以2的几次方
右移几位,就相当于除以2的几次方位数,
如果移除的位数大于等于数据类型的位数,就是对他进行取余操作
a << m
a << m(mod n)
注:mod和%的区别,mod无正负之分
面试题
1.请用最有效率的方式写出计算2乘以8的结果
2<<3
2.请自己实现两个整数变量的交换
1.临时变量的交换
2.加法的互逆(a + b - b = a)
3.按位异或的互逆(a ^ b ^ b = a)
a = a ^ b;
b = a ^ b; // b = (a ^ b) ^ b;
a = a ^ b; // a = (a ^ b) ^ a
4.把2,3写成一行
a = ( a + b ) - ( b = a );
a = ( a ^ b ) ^ ( b = a );
3.判断一个数是否是2的n次幂
(1)方法一:是否能被2整除,时间O(logn)
(2)方法二:关键分析2的n次幂的特点,二进制表示只有1位1
a: 00000100000000000000000000
a-1: 00000011111111111111111111
a: 00000100000001000000000000
a-1: 00000100000000111111111111
利用按位与
2的n次幂能被整除的条件:(a & (a-1)) == 0
4.一堆整数中都是成双存在,只有一个数是单独存在,请找出这个数?
提示:用 ^ (按位异或)运算
5.%运算符是一个比较复杂的操作,对于正整数a而言,怎么替换a%b运算 (b 必须是 2^n次幂)?
a % b == a & (b - 1)
6.求一个数的绝对值
int i = a >> 31; //取符号位,正数 i = 0,负数 i = -1
return i == 0 ? a : (~a + 1);
改进版:
int i = a >> 31;
return ((a ^ i) - i);
键盘录入
1.导包
import java.util.Scanner;
2.创建对象
Scanner sc = new Scaner(System.in);
3.接受数据
int a = sc.nextInt();