大家好,我是贺贺,今天跟大家聊聊Java中的位运算符,说起来位运算符不知道你想起了什么,我是想起了二进制。

常用的运算符

在Java语言中,官方给我们提供了极为丰富的运算操作,但是常用的,好像也就是算术运算符,例如加、减、乘、除、取余等。还有就是关系运算符大于、小于、等于、不等于等。再或者就是逻辑运算符&&、||、!等,至于位运算符,属实用的不多。用的不多今天为什么拿出来讲呢,首先这可以帮助你很好的去理解计算机的底层原理,其次可以让你在面试中略胜一筹,还有就是有些人分不清逻辑运算符和位运算符的区别,例如&&和&,||和|,区别分别是什么,反正刚开始我是有点迷惑,所以这篇文章呢,也算是为自己解惑了。

位运算符

位运算符,从字面意思上看,就可以知道,是位运算,其实并不难,只是我们不经常用,再加上跟逻辑运算符的混淆,所以就容易让人迷迷糊糊。这里主要讲解&、|、^、~、>>、<<、>>>。其中 ~ 和 >>> 较为复杂。

&、|、^ 运算符

&是按位与,|是按位或、^是按位异或,这三种位运算相对简单,下面给出程序截图,大家应该可以一目了然。

~ 运算符

首先我们要清楚,数字在计算机中是以二进制存储的,准确的说是以二进制的补码形式存储的,我们看到的数一般是以二进制的原码形式转化为十进制展示的,正数的原码、反码、补码是其本身,而负数的反码是符号位不变,其余取反。负数的补码是其反码+1。这里通过简单的例子,来解释原码、反码、补码。
我们以数字5为例,这里通过一个字节来进行讲解。5的原码是00000101,反码也是00000101,补码还是00000101,其中在计算机存储的是补码。如果对5进行取反是什么呢,5的原码取反之后是11111010,提醒:(最高位1表示该数是负数,0表示该数是正数)。但是计算机中存储的是补码,按上面所说的,负数的补码是反码加1。反码是10000101(负数的反码是不改变符号位哦),这里的第一个1就是是表示符号,再加1,就是补码10000110,也就是我们看到的-6。说明:取反是把所有的1变成0,所有的0变成1,反码是除了符号位不变,其余的1变0,0变1。

<< 和 >> 运算符

简单的理解,<<1 是乘2,>>1是除以2,其中正数右移是前补0,负数右移是前补1。这里的运算要比* /的速度快,看JDK原码的时候,大家应该都见过这些符号。

>>> 运算符

这个是无符号右移,什么叫无符号呢,首先说一下什么是有符号右移,有符号右移,也就是,当该数字是正数,右移前补0,当该数字是负数,右移前补1。而无符号右移不管是正数还是负数,都是前补0。这里以-5为例子进行讲解,通过无符号右移,负数变正数。

有<<<运算符吗

先说结论,是没有<<<运算符的,因为我们知道在右移的时候,存在着高位是补0还是补1的选择,如果是普通的右移,根据原数字的正负来决定是补0还是补1,而无符号右移,则高位通通补1。因为高位是决定一个数的正负的,而在左移的时候,是在最低位补0,高位的数字是由高位右边的第一个数字决定的,所以不存在补0还是补1的情况,所以没有无符号左移。

为什么8位是-128 ~ 127

既然聊到这了,顺便解释一下,为什么占8位的数字范围是-128 ~ 127,首先,我们要注意0这个数是属于 -128 ~ 127的,也就是说,这一共有256个数字,而127的二进制表示就是0111 1111,0的二进制是0000 0000,1000 0000,这个按说是-0,但是0和-0是不是就重复了,所以规定-0就表示-128,也就是1000 0000表示-128,1111 1111这个二进制表示的是-127哦。

小安的故事

最后给大家分享一个小故事,小安是一个大一新生,由于高考没考好,所以在学校和宿舍就比较飘,感觉学校都装不下他,再怎么说,他也是个大一新生吗,好多东西都不太懂,时间很快,军训就要来了,他喜欢独来独往,也不跟室友一起,平时也很晚才回宿舍,就一个人,一天天的不知道在想啥,时间很快,军训结束了。他是计算机专业的,因为他平时就很飘,所以学编程的时候,也是偷偷的努力,然后惊艳所有人,他听到的最开心的一句话就是“小安,平时看你不说话,也不学习,没想到你编程学这么好呀”,其实他的努力只有自己知道,他呢,是个不聪明的人,其实他的努力不配考这么差,就这样一天一天的过去,他每天过的很充实,很多同学也挺羡慕他,就像他羡慕其他同学一样。

学了这么久Java都没搞懂位运算符相关推荐

  1. android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!

    0. 前言 做 Android 开发肯定离不开跟 Handler 打交道,它通常被我们用来做主线程与子线程之间的通信工具,而 Handler 作为 Android 中消息机制的重要一员也确实给我们的开 ...

  2. 同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作

    因为工作需要,同事刚开始学python,学到selenium这个工具半个月都没整明白,因为这个令他头秃了半个月,最后找到我给他解答. 所以我用一个淘宝爬虫实例给他解释了一遍,不用一个小时他就搞懂了.初 ...

  3. 指针都没搞懂,还能算得上 C++ 老司机?

    在工业界,有这样一个规律: " 但凡能用其他语言的都不会用C++,只能用C++的必然用C++." 但是,C++的学习和项目开发都比较困难. 一个有经验的老手也经常搞出野指针,内存泄 ...

  4. 指针都没搞懂,还能算得上 C++ 老司机?

    在工业界,有这样一个规律: " 但凡能用其他语言的都不会用C++,只能用C++的必然用C++." 但是,C++的学习和项目开发都比较困难. 一个有经验的老手也经常搞出野指针,内存泄 ...

  5. 6选择内核启动项_Linux内核都没搞懂,Alot和你还有什么关系?

    文章字数:3000 干货指数:⭐⭐⭐⭐⭐ 近几年,"AIoT"火的一塌糊涂,2020抗疫期间,我国更是应用了一系列AI机器人和物联网技术来防控疫情,"硬核科技" ...

  6. 整理架构师都没搞懂的设计模式

    一.概述 二.创建型 1. 单例(Singleton) 2. 简单工厂(Simple Factory) 3. 工厂方法(Factory Method) 4. 抽象工厂(Abstract Factory ...

  7. Java初学者都应该搞懂的六个问题

    对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容均来自于CSDN的经典老贴. ...

  8. JAVA每个初学者都应该搞懂的问题 还可以比较基础

    还可以比较基础 转自http://blog.csdn.net/devillyd/article/details/2486520 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Ja ...

  9. 每个Java初学者都应该搞懂的六个问题

    对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容均来自于CSDN的经典老贴. ...

最新文章

  1. block用法(转)
  2. linux中js文件有乱码,解决node.js读取文件时中文乱码问题
  3. 【杂谈】从失业到重要项目负责人,2020年里我如何在有三AI上岸
  4. T-SQL里数据库工程师都不知道的秘密之SQL Server自定义函数UDF
  5. 【Python】解决TypeError: 'unicode' object does not support item assignment
  6. iOS 根据图片URL从本地相册获取图片
  7. javascript 西瓜一期 04 解释型语言与编译型语言的翻译过程
  8. linux string
  9. Android功耗(16)---自启动管理
  10. 2021-2025年中国冻融室行业市场供需与战略研究报告
  11. ambari下 hive metastore 启动失败
  12. 现任明教教主 NAC Framework EOU 视频
  13. 转载 网络维护专家坐谈
  14. 多领域中文语音识别数据集 WenetSpeech 正式发布——有效下载教程
  15. VUE根据后端返回url链接下载文件
  16. java ipv6工具,支持通过IPv6地址和子网大小 计算开始结束地址
  17. python导入表格数据混乱_Python按行打乱Excel表格数据
  18. 如何编写旋转时钟(源代码)
  19. 电池SOC仿真系列-基于EKF算法的电池SOC估算研究
  20. python面向对象编程思想_面向对象编程思想及其特点

热门文章

  1. ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题
  2. ICSharpCode.SharpZipLib 压缩、解压文件 附源码
  3. MSIL实用指南-生成break和continue
  4. ssm整合spring,springmvc,mybatis-day12
  5. 《软件需求十步走》阅读笔记5
  6. Apache的多处理模块MPM
  7. 网络编程套接字Socket
  8. UDP套接字编程以及提高UDP可靠性的方法
  9. Linux查找(find)指令的使用
  10. Retrofit使用