广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础教程之整数运算
  • 156
分享到

Java基础教程之整数运算

2024-04-02 19:04:59 156人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录引言溢出自增/自减移位运算位运算运算优先级类型的自动提升与强制转型练习小结总结引言 Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。例如

引言

Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。例如:

public class Main {
    public static void main(String[] args) {
        int i=(100+200)*(99-88);//3300
        int n=7*(5+(i-9));//23072
        System.out.println(i);
        System.out.println(n);
    }
}

输出

3300
23072

整数运算的数值不但是精确的,而且整数运算永远是精确的,即使是出发,因为两个整数相除只得到结果的整数部分,不进行四舍五入

int x=11/3;

求余运算

int x=11%3;

整数除法对于被除数为0运行时报错,但编译时不报错

溢出

整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会报错而会得到一个奇怪的结果。

public class Main {
    public static void main(String[] args) {
        int x=2147483640;
        int y=15;
        int sum=x+y;
        System.out.println(sum);
    }
}

运行结果

-2147483641

要解释上述结果,我们把整数2147483640和15换成二进制做加法

0111 1111 1111 1111 1111 1111 1111 1000

+ 0000 0000 0000 0000 0000 0000 0000 1111

1000 0000 0000 0000 0000 0000 0000 0111

由于最高位计算结果为1,因此加法结果变成了一个负数

要解决上面的文件,可以把int换成long类型,由于long可表示的整型范围更大,所以结果不会溢出

public class Main {
    public static void main(String[] args) {
        long x=2147483640;
        long y=15;
        long sum=x+y;
        System.out.println(sum);
    }
}

还有一种简写的运算符,即+=,-=,*=,/=,使用方法如下

n+=100; //相当于n=n+100
n-=100;//相当于n=n-100

自增/自减

Java还提供了++运算和--运算,它们可以对一个整数进行加1和减1的操作:

public class Main {
    public static void main(String[] args) {
        int n=100;
        n++;
        System.out.println(n);
        n--;
        System.out.println(n);
    }
}

注意++写在前面和后面计算结果是不同的,++n表示先加1再引用n,n++表示先引用n再加1。不建议把++运算混入到常规运算中,容易自己把自己搞懵了。

移位运算

在计算机中,整数总是以二进制的形式表示。例如,int类型的整数7使用4字节表示的二进制如下:

00000000 00000000 00000000 00000111

可以对整数进行移位运算。对整数7左移1位将得到整数14,左移2位将得到整数28

int n = 7;       // 00000000 00000000 00000000 00000111 = 7
int a = n << 1;  // 00000000 00000000 00000000 00001110 = 14
int b = n << 2;  // 00000000 00000000 00000000 00011100 = 28
int c = n << 28; // 01110000 00000000 00000000 00000000 = 1879048192
int d = n << 29; // 11100000 00000000 00000000 00000000 = -536870912

左移29位时,由于最高位变成了1,因此结果变成了负数

类似地对证书7进行右移结果如下

int n = 7;       // 00000000 00000000 00000000 00000111 = 7
int a = n >> 1;  // 00000000 00000000 00000000 00000011 = 3
int b = n >> 2;  // 00000000 00000000 00000000 00000001 = 1
int c = n >> 3;  // 00000000 00000000 00000000 00000000 = 0

如果对一个负数进行右移,最高位1不动,结果仍然是一个负数

int n = -536870912;
int a = n >> 1;  // 11110000 00000000 00000000 00000000 = -268435456
int b = n >> 2;  // 10111000 00000000 00000000 00000000 = -134217728
int c = n >> 28; // 11111111 11111111 11111111 11111110 = -2

还有一种不带符号的右移运算,使用>>>,它的特点是符号位跟着动,因此,对一个负数进行>>>右移,它会变成正数,原因是最高位的1变成了0:

int n = -536870912;
int a = n >>> 1;  // 01110000 00000000 00000000 00000000 = 1879048192
int b = n >>> 2;  // 00111000 00000000 00000000 00000000 = 939524096
int c = n >>> 29; // 00000000 00000000 00000000 00000111 = 7
int d = n >>> 31; // 00000000 00000000 00000000 00000001 = 1

对byte和short类型进行位移时,会首先转换为int再进行位移

左移实际上就是不断地*2,右移实际上就是不断地/2

位运算

位运算是按位进行与,或,非和异或的运算。

与运算的规则是,必须两个数同时为1,结果才为1

n=0 & 0;//0
n=0 & 1;//0
n=1 & 0;//0
n=1 & 1;//1

或运算的规则是,只要任意一个为1,结果就为1

n = 0 | 0; // 0
n = 0 | 1; // 1
n = 1 | 0; // 1
n = 1 | 1; // 1

非运算的规则是,0和1呼唤

n = ~0; // 1
n = ~1; // 0

异或运算的规则是,如果两个数不同,结果为1,否则为0

n = 0 ^ 0; // 0
n = 0 ^ 1; // 1
n = 1 ^ 0; // 1
n = 1 ^ 1; // 0

对于两个整数的运算,实际上就是按位对齐,然后依次对每一位进行运算。例如

public class Main {
    public static void main(String[] args) {
        int i = 167776589;
        int n = 167776512;
        System.out.println(i&n);
    }
}

运行结果

167776512

上述按位与运算实际上可以看作两个整数表示的IP地址10.0.17.7710.0.17.0,通过与运算,可以快速判断一个IP是否在给定的网段内。

运算优先级

在Java的计算表达式中,运算优先级从高到低依次是:

  • ()
  • ! ~ ++ --
  • * / %
  • + -
  • << >> >>>
  • &
  • |
  • += -= *= /=

记不住也没关系,只需要加括号就可以保证运算的优先级正确。

类型的自动提升与强制转型

在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int:

public class Main {
    public static void main(String[] args) {
        short s = 1234;
        int i = 123456;
        int x = s + i; //s自动转换为int
        short y = s + i;//编译错误
    }
}

也可以将结果强制转型,即将大范围的整数转型为小范围的整数。强制转型使用(类型),例如,将int强制转型为short:

int i=12345;
short s = (short) i;//12345

超出范围的强制转型会得到错误的结果,原因是转型时,int的两个高位直接直接被扔掉,仅保留了低位的两个字节。

举例说明

public class Main {
    public static void main(String[] args) {
        int i1 = 1234567;
        short s1 = (short) i1; // -10617
        System.out.println(s1);
        int i2 = 12345678;
        short s2 = (short) i2; // 24910
        System.out.println(s2);
    }
}

结果

-10617
24910

为什么结果是-10617和24910呢

首先把1234567转换成二进制并且使用8位分割成4份

00000000 00010010 11010110 10000111‬

强制转换成short类型或高位被抛弃留下低位两个字节

11010110 10000111

最高位为1是负数,负数是以补码的形式存储在计算机内需要转换成原码

原码等于补码-1后除符号位取反

补码-1结果

11010110 10000110

除符号位取反得到原码

10101001 01111001

最高位为1所以是负数101001 01111001即-10617

同理计算12345678去掉高两位后剩下的最高位为0是正数则补码和原码是一样的

练习

计算自然数之和

public class Main {
    public static void main(String[] args) {
        int n=100;
        int sum=0;
        for(int i=1;i<=n;i++) {
            sum=sum+i;
        }
        System.out.println(sum);
    }
}

小结

整数运算的结果永远都是精确的

运算结果会自动提升

可以强制转型,但超出范围的强制转型会得到错误的结果

应该选择合适范围的整型(int或long),没有必要为了节省内存而使用byte和short进行整数运算。

总结

到此这篇关于Java基础教程之整数运算的文章就介绍到这了,更多相关Java整数运算内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java基础教程之整数运算

本文链接: https://www.lsjlt.com/news/141800.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java基础教程之整数运算
    目录引言溢出自增/自减移位运算位运算运算优先级类型的自动提升与强制转型练习小结总结引言 Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。例如...
    99+
    2022-11-13
  • Java 基础 之 算数运算符
    转载于 : http://www.verejava.com/id=16992579787012 public class Operation {public static ...
    99+
    2023-06-02
  • Java 基础 之 逻辑运算
    转载于 : http://www.verejava.com/id=16992598459515 public class Operation4 {public static&nbs...
    99+
    2023-06-02
  • 一起学JAVA基础之运算符
    目录1 运算符1.1 概述1.2 运算符速查表1.3 练习:测试自增自减1.4 练习:测试逻辑运算符1.5 练习:求两数的最大值1.6 练习:求平年闰年2 拓展补充:2.1 总结1:...
    99+
    2022-11-13
  • java基础教程之接口
    定义:接口就是多个类的共有规范(里面的抽象方法),是一种引用数据类型。小提示:基本数据类型包括数值型(整数和浮点数)、字符型、布尔型。格式:public interface 接口名称{ //接口内容 }备注:接口.java编译后仍然是接口...
    99+
    2019-04-11
    java入门 java 接口
  • Java基础之位运算知识总结
    目录一、位运算的分类与展现效果二、原理三、边界值测试一、位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移。   java只对整型位移,可...
    99+
    2022-11-12
  • 初识Java基础之数据类型与运算符
    目录数据类型布尔类型字符串类型String拼接字符'+'转义字符运算符加减乘除模运算增量赋值运算符自增运算符和自建运算符赋值运算符判断运算符逻辑判断符按位运算符移位运算条件运算符运算...
    99+
    2022-11-12
  • Java编程基础元素-运算符
    目录1 前言2 算术运算符2.1 四则运算2.2 字符串运算符2.3 一元运算符3 关系运算符4 逻辑运算符5 位运算符6 码农洞见6.1 运算符思维导图6.2 运算符优先级1 前言...
    99+
    2022-11-12
  • Python基础之注释,算数运算符,变量
    Python的注释 注释的作用:用自己熟悉的语言,对某些代码进行标注说明,增强程序的可读性; 在python解释器解释代码的过程中,凡是#右边的,解释器都直接跳过这一行; 注释的分类 单行注释 # 这里是注释 print("hello w...
    99+
    2023-01-31
    注释 变量 运算符
  • Java基础之逻辑运算符知识总结
    目录一、前言二、逻辑运算符三、代码四、结果五、练习一、前言 逻辑运算符 左右都是布尔类型的操作数,表达式的结果也是布尔类型 true或false 二、逻辑运算符 &...
    99+
    2022-11-12
  • Python编程基础之运算符重载详解
    目录学习目标一、运算符重载(一)概述(二)加法运算重载符1、概述2、案例演示总结学习目标 1.掌握运算符重载 2.会定制对象字符串的形式 一、运算符重载 (一)概述 运算符重载是通过...
    99+
    2022-11-13
  • Java基础教程之数组的定义与使用
    目录一.数组的基本概念二.数组的声明三.数组的创建及初始化1.数组的创建2.数组的初始化四.访问数组元素 五.for each 循环 六.数组的拷贝 七.数组排序 八.二维数组 总结...
    99+
    2022-11-12
  • Kotlin基础教程之数据类型
    Kotlin基础教程之数据类型一切都是对象.在Kotlin中一切都是对象.Kotlin有一些基本类型Boolean,Byte,Shot,Int,Long,Float,Double在Kotlin中没有原始类型,以上这些类型都是对象,比如运行结...
    99+
    2023-05-31
    kotlin 教程 数据类型
  • 关于Java大整数运算之BigInteger类
    目录一、BigInteger类简单介绍二、BigInteger构造方式(1)构造方式(2)输入方式三、BigInteger常见的成员方法(1)方法介绍(2)方法使用演示1.加减乘除余...
    99+
    2023-05-19
    Java BigInteger类 Java大整数运算
  • Java基础学习之运算符相关知识总结
    1.算术运算符 +表示加法运算符 -表示减法运算符 *表示乘法运算符 /表示除法运算符 %表示取模/取余运算符 package com...
    99+
    2022-11-12
  • Java基础之详细总结五种常用运算符
    目录一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、位运算符一、算术运算符 算术运算符的符号通常为:加(+)、减(-)、乘(*)、除(/)、取余(%)、自增(++)、自减...
    99+
    2022-11-12
  • PHP基础巩固之运算符和流程控制
    (二)分类 赋值运算符 算术运算符 比较运算符 逻辑运算符 连接运算符错误抑制符三目运算符自操作运算符位运算符(三)算数运算符<php $a = 5; $b = 6; echo -$a;echo "<br&g...
    99+
    2018-05-30
    PHP
  • Python基础学习教程:Python基础之基本数据类型(一)
    Python基础学习教程:Python基础之基本数据类型(一)...
    99+
    2023-06-02
  • python基础教程之匿名函数lambda
    python lambda 当我们在使用函数时,有时候,并不需要显示的定义一个函数,我们可以使用匿名函数更加方便,在Python中对匿名函数也提供了支持。 比如当我们想计算两个数a,b之和时,即f(a,...
    99+
    2022-06-04
    基础教程 函数 python
  • Python教程之基本运算符的使用(下)
    目录运算符的优先级和关联性运算符优先级运算符关联性Python 运算符测验浮动划分整数除法(地板除法)要点运算符的优先级和关联性 运算符的优先级和关联性: 运算符的优先级和关联性决定...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作