一定要让你搞懂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哦。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java 位运算符>>与>>>区别案例详解

    下图是java教程中对于>>和>>>区别的解释,但是介绍的并不详细,因为这两种运算符是以补码二进制进行运算的. 1.学习过计算机原理的都知道,数字是以补码的形式在计算机中存储的,那么源码,反码,补码之间的关系是如下所示: **正整数**的原码.反码和补码都一样: **负数部分**: 1.原码和反码的相互转换:符号位不变,数值位按位取反 2.原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1 3.已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1 2.了解

  • Java移位运算符详解实例(小结)

    移位运算符它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 运算符 含义 << 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) >> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数.使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补

  • Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位(符

  • Java中的位运算符、移位运算详细介绍

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3)按位取反(~):0 变 1, 1变0: (4)按位异或(^):两位,如果相同,结果为0:如果不同,结果为1: 注意: (1)位运算中的 符号位(最高位)也跟着变; (2)位运算符与逻辑运算符(逻辑与&&.逻辑或||.逻辑非! )有点相似.但是,逻辑运算符只能操作boolean变量 (也就是左右两边的值

  • java中关于移位运算符的demo与总结(推荐)

    首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0填充,多余位舍弃.(等同于乘2的n次方) >> 右移运算符,二进制数据向右移动*位,就在其二进制数据后抹掉几位?(这里还不错定,但个人理解是这样的)(等同于除2的n次方) >>> 无符号右移运算符,不管移动前最高位是0还是1,右移后左侧产生的空位部分都以0来填充. 下面我们借一个

  • 一定要让你搞懂Java位运算符

    目录 常用的运算符 位运算符 &.|.^ 运算符 ~ 运算符 << 和 >> 运算符 >>> 运算符 有<<<运算符吗 总结 常用的运算符 在Java语言中,官方给我们提供了极为丰富的运算操作,但是常用的,好像也就是算术运算符,例如加.减.乘.除.取余等.还有就是关系运算符大于.小于.等于.不等于等.再或者就是逻辑运算符&&.||.!等,至于位运算符,属实用的不多.用的不多今天为什么拿出来讲呢,首先这可以帮助你很好的去理解

  • 一文搞懂Java MD5算法的原理及实现

    目录 MD5加密简介 MD5加密原理 MD5加密常用方法 MD5加密简介 哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称. 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果. 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的. MD5加密原理 MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文. 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包级联生成一个128位的哈希

  • 一文搞懂Java中的序列化与反序列化

    目录 序列化和反序列化的概念 应用场景 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 静态变量不会被序列化 使用序列化实现深拷贝 常见序列化协议对比 小结 序列化和反序列化的概念 当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时.但有时候可能存在一种"持久化"场景:我们需要让对象能够在程序不运行的情况下,仍能存在并保存其信息.当程序再次运行时 还可以通过该对

  • 一篇文章带你搞懂Java线程池实现原理

    目录 1. 为什么要使用线程池 2. 线程池的使用 3. 线程池核心参数 4. 线程池工作原理 5. 线程池源码剖析 5.1 线程池的属性 5.2 线程池状态 5.3 execute源码 5.4 worker源码 5.5 runWorker源码 1. 为什么要使用线程池 使用线程池通常由以下两个原因: 频繁创建销毁线程需要消耗系统资源,使用线程池可以复用线程. 使用线程池可以更容易管理线程,线程池可以动态管理线程个数.具有阻塞队列.定时周期执行任务.环境隔离等. 2. 线程池的使用 /** *

  • 一文搞懂JAVA 修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ClassName { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] argum

  • 一文搞懂JAVA 枚举(enum)

    Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割. 例如定义一个颜色的枚举类. enum Color { RED, GREEN, BLUE; } 以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色. 使用实例: enum Color { RED, GREEN, BLUE; } public c

  • 一文搞懂Java中的反射机制

    前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,自己掌握好节奏就好. 好了,言归正传. 反射机制是Java中的一个很强大的特性,可以在运行时获取类的信息,比如说类的父类,接口,全部方法名及参数,全部常量和变量,可以说类在反射面前已经衣不遮体了(咳咳,这是正规车).先举一个小栗子

  • 两个小例子轻松搞懂 java 中递归与尾递归的优化操作

    废话不多说,我们直接上两个最常见的小例子: 一.递归,伪递归,迭代实现n! package com.njbdqn.test02; /** * 递归,伪递归,迭代实现n! */ public class RecursionTest { public static void main(String[] args) { System.out.println(recurse(5)); //递归显示 System.out.println(camouflageRecurse(5, 1)); //伪递归 Sy

  • 3分钟快速搞懂Java的桥接方法示例

    什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥接方法. 在字节码文件中,桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于表示该方法是由编译器产生的桥接方法,ACC_SYNTHETIC用于表示该方法是由编译器自动生成. 什么时候生成桥接方法? 为了实现哪些Java语言特性会生成桥接方法?最常见的两种

  • 一文彻底搞懂Java和JDK的版本命名问题

    Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java Development Kit).所以我们常常在CSDN等各大程序员论坛讨论到安装Java8或者JDK8或者JDK1.8或J2SE8或J2SE1.8或J2SE8或J2SE1.8,其实这3个专业词汇的概念是一样的. 告诉庆哥,你对Java的版本号以及JDK的命名真正清楚嘛?比如: Java8 Java SE 8.0 JDK1.8 -- 知道这些是怎么回事嘛?

随机推荐