首页 > 技术文章 > Java语法基础——运算符

grape 2013-08-04 14:16 原文

取余运算,取模运算——获取除法结果中的余数

  1. 负数取余的结果:负数和0
  2. 正数方向,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++:

  1. 先取a的值作为整个(a++)表达式的值
  2. 然后将a的值增加1

++a:

  1. 先将a的值增加1
  2. 然后取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 }

 移位运算(针对二进制)

  1. 什么是移位运算:<<左移位  >>数学右位 >>>逻辑右移
  2. 移位运算的意义:就是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     }

 

推荐阅读