java移位运算符

java中关于移位运算符的demo与总结,运算符demo

首先,移位运算符有三种,其操作类型只支持:byte / short / char /
int和long五种。

<<
左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0填充,多余位舍弃。(等同于乘2的n次方)

>>
右移运算符,二进制数据向右移动*位,就在其二进制数据后抹掉几位?(这里还不错定,但个人理解是这样的)(等同于除2的n次方)

>>>
无符号右移运算符,不管移动前最高位是0还是1,右移后左侧产生的空位部分都以0来填充。

下面我们借一个demo帮助理解:

图片 1

public static void main(String[] args){
        int a = 16;
        int b = a << 2;//左移2,等同于16 * 2的2次方,也就是16 * 4
        int c = a >> 2;//右移2,等同于16 / 2的2次方,也就是16 / 4

        System.out.println("a的二进制数据为:" + Integer.toBinaryString(a));
        System.out.println("a左移后二进制数据为:" + Integer.toBinaryString(b));
        System.out.println("a右移后二进制数据为:" + Integer.toBinaryString(c));

        System.out.println("a左移后的值为:" + b);
        System.out.println("a右移后的值为:" + c);
    }
}

图片 2

查看运行结果,如图所示:

图片 3

首先,16的二进制数据为:10000;

左移两位,10000变成1000000;

右移两位,10000变成100;

把得到的二进制数据转换成普通数据后,

a左移后的值为64,既16 * 2的2次方(16 * 4)。

a右移后的值为4,既16 / 2的2次方(16 / 4)。

看完这个demo再理解移位运算符是不是就简单很多?

首先,移位运算符有三种,其操作类型只支持:byte / short / char /
int和long五种。 左移运算符,…

这篇博客讲的很清楚

java中有三种移位运算符

<< : 左移运算符,num << 1,相当于num乘以2

>> : 右移运算符,num >> 1,相当于num除以2

<<< : 无符号右移,忽略符号位,空位都以0补齐

Tips:这里的移位指的是二进制位

本文参考:java移位运算符详解

java中有三种移位运算符

 

对应笔试题目

https://www.nowcoder.com/question/next?pid=7489437&qid=14714&tid=11645867

Java移位运算符有三种

  • << 左移运算符,value<<num
  • >> 右移运算符,value>>num
  • >>> 无符号右移运算符, value>>>num

<<      :     左移运算符,num << 1,相当于num乘以2

<< 左移运算符。(value<<num)

2 << 1  // 4

相当与2*2,即将2(value)化为2进制,再向左移移1(num)位,即:
00000010,将1向左移移1位:00000100,化为十进制为4。

  10 << 20

这个相比上个复杂点,但运算方法一样。即:00001010 =
2三次方+2一次方,中的每个1都向左移20位。 即:
图片 4 = 10485760

>>      :     右移运算符,num >> 1,相当于num除以2

>> 右移运算符 (value>>num)

道理和和左移差不多,只不过是反方向。将1向右移num位,其他空位全部补0.

>>>    :     无符号右移,忽略符号位,空位都以0补齐

>>> 无符号右移 (value>>num)

当value是整数时,这种移位方式和‘>>’是一样的。但是当value时负数时则结果完全相反。>>>是不管value转换为2进制后的正负号的,他只管移位,移位后的结果均为整数。看个例子

2>>>1 // 结果为1
-2>>>1 //结果为2147483647 

如果你和博主一样对结果的差别感到震惊的时候,说明你忘了二进制的负数表达方式。

  • 二进制的负数:能被计算机正确识别的是该数补码.(什么?又忘记了什么是补码?)。
  • 补码:该数的反码加1。
  • 反码:原码取反。(即0 -> 1 ,1 -> 0)。
  • 原码:符号位加上真值的绝对值,-1->10000001(什么?不知道什么是绝对值。来,把你的初中体育老师叫来,他怎么教你数学的!)。
  • 关于原码,补码,反码的详细解释戳这里

这里你应该知道-2 的二进制为
111111111111111111111101,再右移后的结果可想而知。

下面来看看这些移位运算都是怎样使用的

总结

  • 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方.
  • 右移一位相当于除2,右移n位相当于除以2的n次方。
  • 无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位,无符号右移运算符>>>
    只是对32位和64位的值有意义

本次总结就到这里,欢迎吐槽。

1 /**
 2  * 
 3  */
 4 package com.b510.test;
 5 
 6 /**
 7  * @author Jone Hongten
 8  * @create date:2013-11-2
 9  * @version 1.0
10  */
11 public class Test {
12 
13     public static void main(String[] args) {
14         int number = 10;
15         //原始数二进制
16         printInfo(number);
17         number = number << 1;
18         //左移一位
19         printInfo(number);
20         number = number >> 1;
21         //右移一位
22         printInfo(number);
23     }
24     
25     /**
26      * 输出一个int的二进制数
27      * @param num
28      */
29     private static void printInfo(int num){
30         System.out.println(Integer.toBinaryString(num));
31     }
32 }

运行结果为:

1010
10100
1010

我们把上面的结果对齐一下:

43210      位数
--------
 1010      十进制:10     原始数         number
10100      十进制:20     左移一位       number = number << 1;
 1010      十进制:10     右移一位       number = number >> 1;

看了上面的demo,现在是不是对左移和右移了解了很多了呢

 

对于:>>>

 无符号右移,忽略符号位,空位都以0补齐

value >>> num     —   num 指定要移位值value 移动的位数。

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位  无符号右移运算符>>> 只是对32位和64位的值有意义

相关文章