取余运算,取模运算——获取除法结果中的余数
- 负数取余的结果:负数和0
- 正数方向,n的余数是周期函数,并且小于n——工作中,周期性的运算经常采用%实现
1 public class Test { 2 public static void main(String[] args) { 3 int n = 5; 4 int m =n % 3;//5/3 得1余2 5 System.out.println("m = "+m); 6 7 System.out.println(-4%3); 8 System.out.println(-3%3); 9 System.out.println(-2%3); 10 System.out.println(-1%3); 11 System.out.println(0%3); 12 System.out.println(1%3); 13 System.out.println(2%3); 14 System.out.println(3%3); 15 } 16 }
自增(减)运算 ++ --
作用是将变量的值自身增加1(减少1)
a++:
- 先取a的值作为整个(a++)表达式的值
- 然后将a的值增加1
++a:
- 先将a的值增加1
- 然后取a的值作为整个(++a)表达式的值
1 public class Test { 2 public static void main(String[] args) { 3 int a = 1; 4 a++;//单行运用前加后加没有差别 5 System.out.println(a);//2 6 ++a; 7 System.out.println(a);//3 8 9 int b = a++; 10 System.out.println(b); 11 a++; 12 //a++:后++,先取a的值,然后增加 13 b = a++;//两个运算,先执行++运算,然后执行赋值=运算 14 //执行顺序参考b = (a++) 15 //++运算 1)先取“a”的值1作为“a++表达式”的值,“a++表达式”值为1 16 //++运算 2)然后将a的值增加1,a为2 17 //=运算 3)将“a++表达式”的值1赋给b,b为1 18 System.out.println(a+","+b);//2,1 19 20 a = 1; 21 a = a++;//两个运算,先执行++运算,再执行赋值=运算 22 //++运算 1)先取“a”的值1作为“a++表达式”的值,“a++表达式”值为1 23 //++运算 2)然后将a的值增加1,a为2 24 //=运算 3)将“a++表达式”的值1赋给a,a为1 25 System.out.println(a);//1 26 System.out.println(a++);//1 27 System.out.println(a);//2 28 for(int i = 0;i<100;i++){ 29 a = a++; 30 } 31 System.out.println(a);//循环100次后a不变 32 } 33 }
逻辑运算
逻辑运算的操作数均为boolean表达式
&&和&都是与,||和|都是或,!非
其中,&&与||具备短路特性,如果(表达式1&&表达式2)中表达式1为假,则不计算第二个表达式,同理,对于||,如果表达式1为真,则不计算第二个表达式。
1 public class Test { 2 public static void main(String[] args) { 3 int a=3; 4 int b=4; 5 if(++a<3&&++b>4){//++a大于3直接执行if外的语句,所以a加1,b不变 6 System.out.println("&&"); 7 } 8 System.out.println("a="+a+"---"+"b="+b);//a=4---b=4 9 a=3; 10 b=4; 11 if(++a<3&++b>4){//虽然++a大于3,但还要执行&右边的运算,所以a加1,b加1 12 System.out.println("&"); 13 } 14 System.out.println("a="+a+"---"+"b="+b);//a=4---b=5 15 } 16 }
移位运算(针对二进制)
- 什么是移位运算:<<左移位 >>数学右位 >>>逻辑右移
- 移位运算的意义:就是2进制的移动小数点运算,左移乘,数学右移除2(整除)!
1 package TestCode; 2 3 4 public class Test { 5 6 public static void main(String[] args) { 7 int a = -2; 8 System.out.println(Integer.toBinaryString(a));//11111111111111111111111111111110 9 int b = a<<1; 10 System.out.println(Integer.toBinaryString(b));//11111111111111111111111111111100 11 b = a>>1; 12 System.out.println(Integer.toBinaryString(b));//11111111111111111111111111111111 13 b = a>>>1; 14 System.out.println(Integer.toBinaryString(b));//1111111111111111111111111111111最前面补了一个0,高位0不显示,看起来就像缺一位 15 16 } 17 }
移位速度快,常见面试题:最快速实现一个整数*(或/)2的n次幂
移位的用途;
拼接或拆分
1、将4个整数192,168,10,23拼接成ip地址192.168.10.23
1 public class Test { 2 3 public static void main(String[] args) { 4 int d1=192,d2=168,d3=10,d4=23; 5 int ip = (d1<<24)+(d2<<16)+(d3<<8)+d4; 6 System.out.println(Integer.toBinaryString(d1)); 7 System.out.println(Integer.toBinaryString(d2)); 8 System.out.println(Integer.toBinaryString(d3)); 9 System.out.println(Integer.toBinaryString(d4)); 10 System.out.println(Integer.toBinaryString(ip)); 11 } 12 }
2、将24位色彩拆分为颜色分量r g b
1 public static void main(String[] args) { 2 int color = 0x685FBF; 3 int mask = 0xff;//掩码 4 int blue = color&mask; 5 int green = (color>>>8)&mask; 6 int red = (color>>>16)&mask; 7 System.out.println(Integer.toBinaryString(color));//11010000101111110111111 8 System.out.println(Integer.toBinaryString(blue));//10111111 9 System.out.println(Integer.toBinaryString(green));//1011111 10 System.out.println(Integer.toBinaryString(red));//1101000 11 int c = ~color;//反色 12 }