美文网首页Java
Java 学习笔记之位移运算符

Java 学习笔记之位移运算符

作者: moonfish1994 | 来源:发表于2019-12-17 11:48 被阅读0次

(最近刚来到简书平台,以前在CSDN上写的一些东西,也在逐渐的移到这儿来,有些篇幅是很早的时候写下的,因此可能会看到一些内容杂乱的文章,对此深感抱歉,以下为正文)


引子

位移运算符以前一直没怎么注意,今天因为某些原因使用了一下,结果跟预期不一样,所以回头看了一下,最终发现在使用的时候还是有一些注意事项的。

正文

Java中提供了3个位移运算符:

  1. 带符号的右移运算符(>>):将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入 0;若值为负,则在高位插入 1 。
  2. 带符号的左移运算符(<<):将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0) 。
  3. 不带符号的右移运算符(>>>):将运算符左边的运算对象向右移动运算符右侧指定的位数。它使用了“零扩展”:无论正负,都在高位插入0 。

我个人是有点儿奇怪为什么没有不带符号的左移运算符呢0-0

首先要明确一点的是,位移运算符进行运算的时候,针对的是数字的补码,这点首先要搞清楚,刚开始我一直在用原码进行推算,所以结果一直出错,表示非常尴尬。如果你不知道原码,补码,反码的概念,可能你需要查找一下相关的资料了解一下,这里就不再多做说明了。

package test;
 
public class Test {
    public static void main(String[] args) {
        
        //11111111 11111111 11111111 11111111    -1补码
        int i = -1;   
        //00000000 00111111 11111111 11111111   无符号右移10位后的补码
        i >>>= 10;     
        //4194303     
        System.out.println("-1(int) >>> 10 : "+i);  
        
        //11111111 11111111 11111111 11111111 111111111 11111111 11111111 11111111
        long l = -1;
        //00000000 00111111 11111111 11111111 111111111 11111111 11111111 11111111
        l >>>= 10;
        //18014398509481983
        System.out.println("-1(long) >>> 10 : "+l);
        
        //short,char,byte进行位运算时都会先转换成int型,刚开始不知道这点,纠结了好久。
        //11111111 11111111 11111111 11111111 
        short s = -1;
        //00000000 00000000 01111111 11111111 
        s >>>= 17;
        //32767 
        System.out.println("-1(short) >>> 17 : "+s);
        
        //11111111 11111111 11111111 11111111
        byte b = -1;
        //11111111 11111111 11111111 11111111
        b >>= 26;
        //-1
        System.out.println("-1(byte) >> 26 : "+b);
    }
}

综上,有几点需要注意:

  1. 位运算是针对数值的补码来进行的。
  2. short,char,byte进行位运算时,需要先将其转换成对应的int型再进行运算。
  3. 当需要移动的位数超过数据类型的位数时,将跟数据类型的位数限制进行取模运算,得到的结果才是真正需要移动的位数。

下面有个通过位移符来实现的输出一个int数值的二进制的方法,可以加深一下学习:

public void printBinInt(String s, int i) {
    System.out.println(s + ", int: " + i + ", binary: ");
    System.out.print(" ");
    //通过循环,用1与数字的每一位相与,从而得出当前位的值是0还是1
    for(int j = 31; j >=0; j--){
        if(((1 << j) & i) != 0)
            System.out.print("1");
        else
            System.out.print("0");
   }
   System.out.println();
}

以上为本篇的全部内容。

相关文章

  • Java 学习笔记之位移运算符

    (最近刚来到简书平台,以前在CSDN上写的一些东西,也在逐渐的移到这儿来,有些篇幅是很早的时候写下的,因此可能会看...

  • java中的运算符

    内容 算数运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 位移运算符 三元运算符java中的运算符,有以下几...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • java 三种运算符理解

    >> : 右移运算符;低位移出,符号位不变 << : 左移运算符;高位移出,符号位不变 >>> : 无符号右移; ...

  • Java运算符的使用和规则

    本篇文章为本人学习笔记,如有错误,希望指正。 Java中运算符大致分为以下几类: 算数运算符 赋值运算符 自增自减...

  • Python ☞ day 2

    Python学习笔记之 运算符 & if语句 & while语句 & for 语句 & break语句 & con...

  • Java中的位移运算

    在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他...

  • 位运算实用技巧(Java实现)

    1. Java支持的位运算符: &:按位与 |:按位或 ~:按位非(Esc下面那个键) ^:按位异或 <<:左位移...

  • Java学习笔记之反射机制

    title: Java学习笔记之反射机制tag: Javacategories: Java 理论介绍 为了便于理解...

  • Java运算符

    Java当中的运算符和我们数学当中加减乘除之类的运算符号相同,在学习Java运算符之前,我们首先来要学习表达...

网友评论

    本文标题:Java 学习笔记之位移运算符

    本文链接:https://www.haomeiwen.com/subject/iuddnctx.html