zoukankan      html  css  js  c++  java
  • 廖雪峰Java1-2Java程序基础-3整数运算

    1.四则运算规则

            int i =(100 + 200) * (99 -88);//3300
            int n = i + 9;//3309
            //除法结果为整数
            int q = n / 100;//33
            //除数为0时运行将报错
            int x = n / 0;//抛出异常:Exception in thread "main" java.lang.ArithmeticException: / by zero
    

    1.2.++运算和--运算

    i++是先访问i然后再自增,而i++则是先自增然后再访问i的值

            int i = 0;
            int a = i++;
            int b = ++i;
            System.out.println(a);//0
            System.out.println(b);//2
    

    1.3.简写的+=和-=

           //取示例1中的n的值
            n += 100;//3409
            n -= 100;//3309
            //取余运算符%
            int m = n % 100;//9
    

    1.4整数运算运算规则

    • 计算结果溢出不报错
    • 计算结果是不正确的
      解决方法:用范围更大的整型。
            int i = Integer.MAX_VALUE;
            System.out.println(i);
            int x = i + 1;
            System.out.println(x);
            long y = (long)i + 1;
            System.out.println(y);
    

    2.移位运算

    • 左移 <<
    • 右移 >>
    • 不带符号右移 >>>
    • byte和short会先转换为int再进行移位
    	int n1 = 5;
            String s1 =  Integer.toBinaryString(5);
            System.out.println("5的二进制:"+s1);
            System.out.println();
    
            int n2 = n1 << 10;//左移10位,在后面加10个0
            String s2 = s1 + "0000000000";//字符串加10个0,得到二进制字符串
            System.out.println(s1+"~对字符串左移10位~"+s2+"	转化为10进制数:"+Integer.parseInt(s2,2));
            System.out.println("直接左移10位:n2="+n2);
            System.out.println();
    
            int n3 = n2 >> 11;//右移11位,去掉11个0
            String s3 = "10";//s2=1010000000000去掉后面的11位数
            System.out.println(s2+"~右移10位~"+s3+"	"+Integer.parseInt(s3,2));
            System.out.println("直接右移11位:n3="+n3);
            System.out.println();
    
            int n4 = n1 << 29;//最高位是符号,1表示符号,0表示整数
            System.out.println(n1+"直接左移29位:"+n4);
            System.out.println();
    
            int n5 = n4 >> 29;//保留符号位右移
            String s5 = "10";//s2=1010000000000去掉后面的11位数
            System.out.println(n4+"直接右移29位:"+n5);
            System.out.println();
    
            int n6 = n4 >>> 29;//无条件右移
            System.out.println(n4+"无条件右移11位:"+n6);
    

    3.位运算

    通常2个整数进行位运算,首先按位对齐,依次对每一位进行进行位运算。

    3.1位运算 与运算& 2个都为1,结果为1

    • 1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0,0 & 0 = 0

    3.2或运算| 有1个为1,结果为1

    • 1 | 1 = 1, 1 | 0 = 0, 0 | 1 = 0,0 | 0 = 0

    3.3亦或运算^不相同结果为1

    • 1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1,0 | 0 = 0

    3.4非运算~

    • ~ 1 = 0, ~ 0 = 1
            int n1 = 0x03_83_d0_25;
            int n2 = 0x00_00_ff_ff;
            int n3 = n1 & n2;
            int n4 = n1 | n2;
            System.out.println(n3);
            System.out.println(n4);
            System.out.println(Integer.toBinaryString(n1));
            System.out.println(Integer.toBinaryString(n2));
            System.out.println("n1&n2:"+Integer.toBinaryString(n3));
            System.out.println("n1|n2:"+Integer.toBinaryString(n4));
    
    具体过程参看下图

    4.运算优先级


    记不住没关系,直接加括号就是

    5.类型自动提升与强制转型

    • 在运算过程中,计算结果为较大类型的整型
    • 可以将结果强制转型:(类型)变量或数值。
    • 强制转型可能丢失精度。long类型是64位,强制转为int类型,会将高位抛弃。
            short s = 12;
            int i = 100 +s;
            long n = 999 * i;
            //int x = n - 199;//编译错误
            int y1 = (int)(n - 199);
            int y2 = (int)n - 199;
            int z = (int)(n * 100000000);
            System.out.println(y1);//111689
            System.out.println(y2);//111689
            System.out.println(z);//410193920
    

    6.总结:

    • 整数运算结果永远精确
    • 运算结果会自动提升
    • 可以强制转型,但可能丢失精度
    • 选择合适范围的整型(int, long)
  • 相关阅读:
    CPP Info Memo part3
    在Google搜索结果显示原始链接(转自 月光博客)
    libc 之 locales
    Git 分支管理与本地 repository 创建
    py2exe issue: ImportError: No module named _fontdata_enc_winansi (http://stackoverflow.com/)
    CPP Info Memo (Part 1)
    CPP Info Memo part2
    HOWTO: Increase write speed by 'aligning' FAT32(通过对齐 FAT32 提高U盘访问速度, 转载)
    (转载)Gentoo中文man乱码
    如何选择开源许可证?(转载)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10242045.html
Copyright © 2011-2022 走看看