目录

  • 1.& 和 && 的区别是什么?
  • 2.谈一谈 Java 中的移位运算符?
  • 3.a = a + b 与 a += b 有什么区别吗?

1.& 和 && 的区别是什么?

(1)&&:逻辑与运算符。当运算符左右两边的表达式都为 true,才返回 true。同时具有短路性,即如果第一个表达式为 false,则直接返回 false,不再判断第二个表达式。

(2)&:逻辑与运算符按位与运算符
按位与运算符:用于二进制的计算,只有对应的两个二进位均为1时,结果位才为1 ,否则为0。
逻辑与运算符:& 在用于逻辑与时,和 && 的区别是不具有短路性。所在通常使用逻辑与运算符都会使用 &&,而 & 更多的适用于位运算。

2.谈一谈 Java 中的移位运算符?

(1)移位运算符是最基本的运算符之一,几乎每种编程语言都包含这一运算符。移位操作中,被操作的数据被视为二进制数,移位就是将其向左或向右移动若干位的运算。移位运算符只作用于整形变量,分为两类,第一类是 long 类型,long 类型长度为 8 字节 64 位;第二类为 int 类,int 长度为 4 字节 32 位,short、byte、char 在做移位之前会自动转换为 int 型,因此与 int 规则一致, 在做完移位运算后,short、byte、char类型都将变成 int 型数据(转换过程中需要考虑高位丢失的问题)。

对于大数据的 2 进制运算,位移运算符比普通运算符的运算要快很多,因为只需对二进制数进行移位,而不用计算,这样即可以提高效率,也能节省资源。

(2)Java 中有以下 3 种移位运算符:

  • 左移运算符 <<:向左移若干位,高位丢弃,低位补零
  • 右移运算符 >>:向右移若干位,高位补符号位,低位丢弃
  • 无符号右移 >>>:无符号右移,忽略符号位,空位均用 0 补齐,最终结果必为非负数。

(3)下面结合几个例子来说说明它们的用法。

  • 左移运算符 <<
int a = 10;
//在不溢出的情况下,下面的代码等价于 int b = a * 2;
int b = a << 1;
System.out.println(a);      // 10
System.out.println(b);      // 20
System.out.println(Integer.toBinaryString(a));      // 1010
System.out.println(Integer.toBinaryString(b));      // 10100
System.out.println();//在不溢出的情况下,下面的代码等价于 int b = a * (2^3) = a * 8 = 80;
int c = a << 3;
System.out.println(a);      // 10
System.out.println(c);      // 80
System.out.println(Integer.toBinaryString(a));      // 1010
System.out.println(Integer.toBinaryString(c));      // 1010000
  • 右移运算符 >>
int a = 10;
//在不溢出的情况下,下面的代码等价于 int b = a / 2;
int b = a >> 1;
System.out.println(a);      // 10
System.out.println(b);      // 5
System.out.println(Integer.toBinaryString(a));      // 1010
System.out.println(Integer.toBinaryString(b));      // 101
  • 无符号右移 >>>
int a = -10;
int b = a >>> 1;
System.out.println(a);      // -10
System.out.println(b);      // 2147483643
System.out.println(Integer.toBinaryString(a));      // 11111111111111111111111111110110
System.out.println(Integer.toBinaryString(b));      // 1111111111111111111111111111011

(4)如果移位的位数超过数值所占有的位数时,会怎样处理?
当 int 类型左移/右移位数大于等于 32 位操作时,会先求余 (%) 后再进行左移/右移操作。也就是说左移/右移 32 位相当于不进行移位操作(32 % 32 = 0),左移/右移 42 位相当于左移/右移 10 位(42 % 32 = 10)。当 long 类型进行左移/右移操作时,由于 long 对应的二进制是 64 位,因此求余操作的基数也变成了 64。也就是说:x << 42 等同于 x << 10,x >> 42 等同于 x >> 10,x >>> 42 等同于 x >>> 10。

int a = 10;
int b = a << 42;
int c = a << 10;
System.out.println(a);      // 10
System.out.println(b);      // 10240
System.out.println(c);      // 10240
System.out.println(Integer.toBinaryString(a));      // 1010
System.out.println(Integer.toBinaryString(b));      // 10100000000000
System.out.println(Integer.toBinaryString(c));      // 10100000000000

参考文章:Java中的移位运算符

3.a = a + b 与 a += b 有什么区别吗?

+= 操作符会进行隐式自动类型转换,此处 a += b 隐式地将加操作的结果类型强制转换为持有结果的类型,而 a = a + b 则不会自动进行类型转换。

byte a = 1;
byte b = 2;
b = a + b;        //报编译错误,不兼容的类型: 从 int 转换到 byte 可能会有精度损失
b += a;           //ok

同理,以下代码有也错误:

short s1= 1;
s1 = s1 + 1;  //报编译错误,不兼容的类型: 从 int 转换到 short 可能会有损失

short 类型在进行运算时会自动提升为 int 类型,也就是说 s1 + 1 的运算结果是 int 类型,而 s1 是 short 类型,从 int 转换到 short 可能会有精度损失,所以会报编译错误。正确写法如下:

short s1= 1;
s1 += 1;

+= 操作符会将右边的表达式结果强转为匹配左边的数据类型,所以没错。

其实,s1 += 1 相当于 s1 = (short)(s1 + 1),有兴趣的可以自己编译下这两行代码的字节码,你会发现是一样的。

Java 基础面试题——运算符相关推荐

  1. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  2. Java继承_30道最常问的Java基础面试题

    30道最常问的Java基础面试题 1. 面向对象和面向过程的区别面向过程优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采 ...

  3. Java 基础面试题,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  4. Java基础知识面试题(2021最新版)

    转载自:https://thinkwon.blog.csdn.net/article/details/104390612 文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 ...

  5. 人类高质量Java基础面试题大全,又是一篇三万字的总结!

    点击主页访问更多精彩文章:https://blog.csdn.net/weixin_45692705?spm=1001.2101.3001.5343 Java基础面试题目录 共勉 ! Java概述 1 ...

  6. 2022 最新 Java 基础 面试题(一)

    2022 最新 Java 基础 面试题(一) 1.面向对象的特征有哪些方面? 3.String 是最基本的数据类型吗? 4.float f=3.4;是否正确? 5.short s1 = 1; s1 = ...

  7. 知识点整理,Java基础面试题(一)

    写在前面 整理了一些互联网大厂的面试题,这些面试题经常会被问到,也是作为Java工程师需要掌握的一些知识点,毕竟理论和实践的结合,才是王道,分片整理,每天嗑些知识点,快乐每一天,如果对你有帮助,记得点 ...

  8. java基础面试题共91道含答案(一)

    ** java基础面试题** Java概述 1. 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了使计算机能够理解人的意图,人类就必须要将需解决 ...

  9. 判断一个java对象中的属性是否都未赋值_100道Java基础面试题(一)

    100道Java基础面试题(一)未来大家将步入职场,面试的时候面试官还会问大家一些Java相关的问题.小编整理出100道非常实用的面试题目,可以帮助双体的小伙伴应对面试,我们一起来看看都有哪些吧! 1 ...

最新文章

  1. 项目Makefile文件模板
  2. mac nginx 非brew安装_Mac下使用Home Brew安装Nginx
  3. Set Up a Mobile Worker
  4. 高级数据结构---并查集
  5. ASP.NET保存信息总结(Application、Session、Cookie、ViewState和Cache等)
  6. mysql 自定义函数入门_【转】MYSQL入门学习之十三:自定义函数的基本操作
  7. Redis Cluster集群的搭建与实践
  8. 2016年1月.CN域名总量净增44.7万 增速环比下降
  9. Excel用SQL合并多个工作表
  10. 2021-01-19第二次Sping Boot学习汇报--利用用Spring Initializr构建项目
  11. php程序root权限,root权限是什么
  12. 系统cpu主频查看设置
  13. UCOS II移植到STM32F103开发板
  14. RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublas‘
  15. 三星android6.0sd卡,三星S7新福利 支持TF卡扩展你乐坏了吗
  16. 怎么让手机变成震动器_手机如何当震动器
  17. vite创建ts项目定义变量无法类型检测
  18. MCP4725 DA转换器的资料
  19. SQL中“有且仅有”一种状态的写法
  20. windows10 结桌面进程,蓝屏

热门文章

  1. java课程设计-广告墙
  2. 《和平精英》重大更新:沙漠之鹰、两栖车上线,SS3赛季巨大调整
  3. Ler(一) stdlib.h,stdio.h,string.h头文件
  4. 【2019年总结】-- 特别的一年
  5. lisp语言画键槽_用LISP语言自定义AutoCAD命令
  6. python 创意项目_5个很酷的Python项目创意灵感
  7. 网页代码常用小技巧!(2)
  8. 2021-12-15 网工基础(十一) VLAN的基本原理、接口类型、Access、Trunk
  9. Yeslab马老师 ESXi 5.0 环境下安装部署Cisco Nexus 1000v
  10. 怎么在WPS计算机,【2人回答】WPS怎么在电脑上打字呢?-3D溜溜网