运算符与二进制问题

一、算术运算符

(一)基本四则运算符:+ - * / (除法) % (取余)

  1. " / " 相关注意事项
public class TestDemo {
   public static void main (String[] args) {
      System.out.println(5/2);//int/int结果还是int,所以要用double型
      System.out.println(5.0/2);//double运算 
      System.out.println((float)5/2);//先将5转为float,在进行除法运算
      System.out.println((float)(5/2);//将int结果强转为float
   }
}

运行结果如图所示

   注意:1. %不仅可以对int求模(取余),也能对double进行求模(取余)
        2. 0不能做除数
   System.out.println(10 / 0);//执行结果:出现异常如下图

算数异常

  1. “%” 相关注意事项(注意负数的除法运算)
   System.out.println(10 % 3);//执行结果:1
   System.out.println(-10 % 3);//执行结果:-1
   System.out.println(10 % -3);//执行结果:1
   System.out.println(-10 % -3);//执行结果:-1

(二)增量赋值运算符(复合运算符): += -= *= /= %=
eg:a += 10; 代表 a = a + 10;

   short a = 1;
   a = a + 1;//error,计算机默认左边为int,右边为short
   a += 1//2,复合运算符会帮我们强制类型转换

(三)自增/自减运算符: ++ - -

   int a = 10;
   int b = ++a;//执行结果:11
   System.out.println(b);
   //先a=a+1 再c=a
      
   int a = 10int c = a++;//执行结果:10
   System.out.println(c);
   //先c=a 再a=a+1
   
   int a = 10;
   int b = ++a;//执行结果:11
   System.out.println(b);
   int c = a++;//执行结果:11
   System.out.println(c);
   //该处a赋值给c时,由于上面的++a,导致a的值为11时赋值给c;而打印出c之后a才自增变为12t  
   
   int i = 10;
   i = i++;//执行结果:10
   System.out.println(i);
   //至于为什么等于10,学习java的反汇编指令,了解即可,较复杂
  注意事项:1.若不取自增/自减运算的表达式的返回值,则前置自增/自减与后置自增/自减没区别
           2.若取表达式的返回值,则前置返回值是自增/自减后的值,后置返回值是自增前的值

二、关系运算符

(一)主要有六种: == != < > <= >=

   注意:关系运算符的表达式返回值都是boolean类型

三、逻辑运算符

(一)逻辑与&&(两个表达式都为true,结果为true,否则结果为false)

(二)逻辑或||(两个表达式都为false,结果为false,否则结果为true)

(三)逻辑非!(表达式为true,结果为false,表达式为false,结果为true,单目操作数,只有一个表达式,只能作用到boolean类型的数据)

(四)短路求值

  1. &&一旦表达式1为假,那么表达式2就不会被执行
  2. ||一旦表达式1为真,那么表达式2就不会被执行
   System.out.println(10>20 && 10/0 == 0);//执行结果:false
   System.out.println(10<20 || 10/0 == 0);//执行结果:true
   //10/0之所以不报错是因为这两个代码都没有执行第二个表达式(短路求值)
   注意:逻辑运算符操作数(往往是关系运算符的结果)和返回值都是boolean类型

四、位运算符

(一)java中对数据存储的最小单位是字节

(二)java中对数据操作的最小单位是二进制位

(三)位运算符主要有四个:&(按位与) |(按位或) ~(按位取反) ^(按位异或)

(四)以13(0000 1101)和11(0000 1011)为例参与二进制运算

  1. 按位与 & 计算结果:0000 1001(数字一样对应写,不一样写0)
  2. 按位或 | 计算结果 :0000 1111(数字一样对应写,不一样写1)
  3. 按位异或 ^ 计算结果:0000 0110(数字一样写0,不一样写1)
  4. 按位取反 ~ 以数字11为例:11110100(把0写为1,把1写为0)

五、移位运算符

(一)左移 << (左移往右边补0,左移相当于乘法)

  eg:11<<1(11(0000 1011)左移1位),结果为:0001 0110(22 = 11*2)
      11<<2,结果为:0010 1100(44 = 11*4)

(二)右移 >> (右移往左补符号位数字,右移相当于除法)

  eg:11>>1,正数补符号位为0,结果为:0000 0101(5 = 11/2^1)
      11>>2,结果为:0000 0010(2 = 11/2^2)
      -1(1111 1111)>>1,负数补符号位为1,结果为1111 1111

(三)无符号右移 >>> (只补0即可)

六、条件运算符(三目运算符)

只有一种:表达式1?表达式2:表达式3
(表达式1为true,整个表达式的值为表达式2的值;表达式1为false,整个表达式的值为表达式3的值)

  //求两个整数的最大值
   int a = 10;
   int b = 20;
   int max = a>b?a:b;//执行结果:20
   System.out.println(max);

七、运算符优先级

不必记忆,存在歧义的代码加上括号即可

八、进制问题

   二进制(由0和1组成)  八进制(由0~7组成)  十进制(由0~9组成)
   十六进制(由0~15组成:10以内用数字表示 10以上用a~f表示(大小写均可))

(一)十进制转二进制(一般不要求)

方法一:
  eg1:求10的二进制:从靠近10的2的次方开始加,第一个为8,第二个为2,因此10=8+2
                   对应到下面的二进制格子中即可得到:0000 1010,
                   8和2分别在第2位和第四位,因此除去第二位和第四位,其他位置补0即可。
  eg2:求75的二进制:第一个靠近75的为64,
                  第二个为靠近75-64=11的2的次方,为8;
                  以此类推,第三个为2,第四个为1 
                  因此75的二进制对应到下面的格子可以得到:0100 1011    

前八位二进制

方法二:辗转相除法
  eg:求10的二进制(如下图所示)

在这里插入图片描述
(二)二进制转十进制

  eg1:求0000 1010的十进制:0000 1010 = 1*2^1+1*2^3 = 10
        即:各个位数字*进制数^该位权重,每一位乘完之后相加即可
  eg2:求 0100 1011的十进制:0100 1011 = 1*2^0+1*2^1+1*2^3+1*2^6 = 75

(三)二进制转八进制

  eg:求130的八进制,则:
      根据辗转相除法可知130的二进制为:010 000 010 =1000 0010(转八进制时常把二进制3位看作一体)
      把010看为一个二进制,代表2;000代表0;010代表2;
      即:202→正确写法:0202(八进制用0开头)

(四)二进制转十六进制

  eg:求130的十六进制,则:
      二进制:1000 0010(转十六进制时常把二进制四位看作一体)
      把1000看作一个二进制,代表8;0010代表2;
      即:0x0000 0082→0x82(十六进制用0x开头)

(五)十六进制转八进制(先转为二进制,再转为八进制)

(五)求负数的二进制

  eg:先取其原码,得到反码,最后得到补码=反码+1,补码即为结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值