《Java从小白到大牛》纸质版已经上架了!!

6.4 位运算符

位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整型数据。位运算符有如下几个运算符:&、|、^、~、>>、<>>,以及相应的赋值运算符,具体说明参见表6-6。

表6-6 位运算符

[图片上传失败...(image-a9ef68-1511744132099)]

注意 无符号右移>>>运算符仅被允许用在int和long整数类型, 如果用于short或byte数据, 则数据在位移之前,转换为int类型后再进行位移计算。

位运算示例代码:

byte a = 0B00110010; //十进制50 ①

byte b = 0B01011110; //十进制94 ②

System.out.println("a | b = " + (a | b)); // 0B01111110 ③

System.out.println("a & b = " + (a & b)); // 0B00010010 ④

System.out.println("a ^ b = " + (a ^ b)); // 0B01101100 ⑤

System.out.println("~b = " + (~b)); // 0B10100001 ⑥

System.out.println("a >> 2 = " + (a >> 2)); // 0B00001100 ⑦

System.out.println("a >> 1 = " + (a >> 1)); // 0B00011001 ⑧

System.out.println("a >>> 2 = " + (a >>> 2)); // 0B00001100 ⑨

System.out.println("a << 2 = " + (a << 2)); // 0B11001000 ⑩

System.out.println("a << 1 = " + (a << 1)); // 0B01100100 ⑪

int c = -12; ⑫

System.out.println("c >>> 2 = " + (c >>> 2)); ⑬

System.out.println("c >> 2 = " + (c >> 2)); ⑭

输出结果如下:

a | b = 126

a & b = 18

a ^ b = 108

~b = -95

a >> 2 = 12

a >> 1 = 25

a >>> 2 = 12

a << 2 = 200

a << 1 = 100

c >>> 2 = 1073741821

c >> 2 = -3

上述代码第①行和第②行分别定义了byte变量a和b,为了便于查看代码采用二进制整数表示。

代码第③行中表达式(a | b)进行位或运算,结果是二进制的0B01111110。a和b按位进行或计算,只要有一个为1,这一位就为1,否则为0。

代码第④行(a & b)是进行位与运算,结果是二进制的0B00010010。a和b按位进行与计算,只有两位全部为1,这一位才为1,否则为0。

代码第⑤行(a ^ b)是进行位异或运算,结果是二进制的0B01101100。a和b按位进行异或计算,只有两位相反时这一位才为1,否则为0。

代码第⑦行(a >> 2)是进行有符号右位移2位运算,结果是二进制的0B00001100。a的低位被移除掉,由于是正数符号位是0,高位空位用0补。类似代码第⑧行(a >> 1)是进行右位移1位运算,结果是二进制的0B00011001。

代码第⑨行(a >>> 2)是进行无符号右位移2位运算,与代码第⑦行不同的是,无论是否有数符号位,高位空位用0补,所以在正数情况下>>和>>>运算结果是一样的。

代码第⑩行(a << 2)是进行左位移2位运算,结果是二进制的0B11001000。a的高位被移除掉,低位用0补位。类似代码第⑪行(a << 1)是进行左位移1位运算,结果是二进制的0B01100100。

代码第⑫声明int类型负数。右位移(>>>和>>)在负数情况下差别比较大。代码第⑬行的(c >>> 2)表达式输出结果是1073741821,这是一个如此大的正数,从一个负数变成一个正数,这说明无符号右位移对于负数计算会导致精度的丢失。而有符号右位移对于负数的计算是正确的,见代码第⑭行。

*提示 有符号右移n位,相当于操作数除以2n,例如代码第⑦行(a >> 2)表达式相当于(a / 22),a = 50所以结果等于12,类似的还有代码第⑧行和第⑭行。另外,左位移n位,相当于操作数乘以2n,例如代码第⑩行(a << 2)表达式相当于(a 22),a = 50所以结果等于200,类似的还有代码第⑪行。**

6.5 其他运算符

除了前面介绍的主要运算符,Java还有一些其他一些运算符。

三元运算符(? :)。例如x?y:z;,其中x、y和z都为表达式。

小括号。起到改变表达式运算顺序的作用,它的优先级最高。

中括号。数组下标。

引用号(.)。对象调用实例变量或实例方法的操作符,也是类调用静态变量或静态方法的操作符。

赋值号(=)。赋值是用等号运算符(=)进行的。

instanceof。判断某个对象是否为属于某个类。

new。对象内存分配运算符。

箭头(->)。Java 8新增加的,用来声明Lambda表达式。

双冒号(::)。Java 8新增加的,用于Lambda表达式中方法的引用。

示例代码如下:

import java.util.Date;

public class HelloWorld {

public static void main(String[] args) {

int score = 80;

String result = score > 60 ? "及格" : "不及格"; // 三元运算符(? : )

System.out.println(result);

Date date = new Date(); // new运算符可以创建Date对象

System.out.println(date.toString()); //通过.运算符调用方法

}

}

此外,还有一些鲜为人知的运算符,随着学习的深入用到后再为大家介绍,这里就不再赘述了。

6.6 运算符优先级

在一个表达式计算过程中,运算符的优先级非常重要。表6-7中从上到小,运算符的优先级从高到低,同一行具有相同的优先级。二元运算符计算顺序从左向右,但是先级15的赋值运算符的计算顺序从右向左的。

表6-7 Java运算符优先级

[图片上传失败...(image-34534b-1511744132099)]

总结 运算符优先级大体顺序,从高到低是:算术运算符→位运算符→关系运算符→逻辑运算符→赋值运算符。

本章小结

通过对本章内容的学习,读者可以了解到Java语言的基本运算符,这些运算符包括算术运算符、关系运算符、逻辑运算符、位运算符和其他运算符。

配套视频

配套源代码

与本书免费版对应的还有一个收费版本:

java下标运算符_《Java从小白到大牛精简版》之第6章 运算符(下)相关推荐

  1. 第68节:Java中的MYSQL运用从小白到大牛

    第68节:Java中的MYSQL运用从小白到大牛 前言 学习java必备要求,学会运用!!! 常见关系化数据库 BootStrap是轻量级开发响应式页面的框架,全局css组件,js插件.栅格系统是将页 ...

  2. 新手java安装教程_给编程小白的java JDK安装教程

    对刚开始学习编程的新手朋友们来说,安装开发环境可谓是一件头疼的事了,为了不让刚准备入门java的朋友还没写出自己的Hello World就被安装开发环境劝退,所以本篇文章诞生了. 下载JDK 打开浏览 ...

  3. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

    笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...

  4. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)

    作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...

  5. java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  6. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩

    import java.io.IOException; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.outp ...

  7. java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  8. java斗地主发牌_[Java源码]扑克牌——斗地主发牌实现

    --------------------------------------- --------------------------------------- ----------一个扑克牌核心和简单 ...

  9. java小朋友猜拳_[Java教程]Java猜拳小游戏(剪刀、石头、布)

    [Java教程]Java猜拳小游戏(剪刀.石头.布) 0 2015-09-29 08:00:04 import java.util.Random;import java.util.Scanner;pu ...

最新文章

  1. 提升10倍生产力:IDEA远程一键部署SpringBoot到Docker
  2. 基于opencv实战眼睛控制鼠标
  3. IIS部署asp.net core webapi
  4. 怎么设置数据库服务器的最佳性能,调整Windows参数提高数据库服务器性能
  5. 二、PyCharm 创建Django 第一个项目
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 19丨行转列【难度中等】​
  7. 花花的礼物 (huahua)
  8. 排序算法与常见数据结构
  9. win8 计算机配置,Win8如何进行系统配置
  10. mysql手册07_存储引擎
  11. (JavaScript案例)可拖动的模态框
  12. 2022-2027年(新版)中国石油化工行业发展建议及投资前景展望报告
  13. PTAL1-087机工士姆斯塔迪奥
  14. uniapp app真机测试
  15. 20155314 2016-2017-2 《Java程序设计》第4周学习总结
  16. php 子都接受邮件,php iamp 接收邮件,收取邮件,获取邮件列表
  17. C++ 总结 基本成员函数
  18. 知识库微信小程序开发
  19. 2016年各大安卓渠道最新商务合作通讯录
  20. 基于SpringBoot的小说网站

热门文章

  1. Java命令行界面(第1部分):Apache Commons CLI
  2. Apache Spark软件包,从XML到JSON
  3. java静态导入_Java中越来越多地接受静态导入吗?
  4. akka es/cqrs_在Akka中实现主从/网格计算模式
  5. Java SE 8新功能介绍:使用Streams API处理集合
  6. Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock
  7. (单元测试)JavaBeans的技巧
  8. 简而言之,JUnit:Hello World
  9. Gradle入门:简介
  10. 在Spring中使用jOOQ:CRUD