浅谈java中的移动位运算:,>>>

1. 概念

<< 左移运算符,左移是在后面补0, num << 1,相当于num乘以2
>> 右移运算符, 右移是在前面补1或0,num >> 1, 相当于num除以2
>>> 无符号右移,是在前面补0, 忽略符号位,空位都以0补齐
另外, 不论是左右还是右移32位,相当于不移动,还是原值。

实际上 在java虚拟机执行这句代码的时候如下这样执行的:
5>>(n%32)--->结果
你这里n=32 ;所以5>>32即是 5>>(32%32)-->5>>0 的结果;

 2. 测试代码

public class Test{
 public Test(){
 System.out.println("=============算术右移 >> ===========");
 int i=0xC0000000;
 System.out.println("移位前:i= "+i+" = "+Integer.toBinaryString(i)+"(B)");
 i=i>>28;
 System.out.println("移位后:i= "+i+" = "+Integer.toBinaryString(i)+"(B)");

 System.out.println("---------------------------------");

 int j=0x0C000000;
 System.out.println("移位前:j= "+j+" = "+Integer.toBinaryString(j)+"(B)");
 j=j>>24;
 System.out.println("移位后:j= "+j+" = "+Integer.toBinaryString(j)+"(B)");

 System.out.println("\n");
 System.out.println("==============逻辑右移 >>> =============");
 int m=0xC0000000;
 System.out.println("移位前:m= "+m+" = "+Integer.toBinaryString(m)+"(B)");
 m=m >>> 28;
 System.out.println("移位后:m= "+m+" = "+Integer.toBinaryString(m)+"(B)");

 System.out.println("---------------------------------");

 int n=0x0C000000;
 System.out.println("移位前:n= "+n+" = "+Integer.toBinaryString(n)+"(B)");
 n=n>>24;
 System.out.println("移位后:n= "+n+" = "+Integer.toBinaryString(n)+"(B)");

 System.out.println("\n");
 System.out.println("==============移位符号的取模===============");
 int a=0xCC000000;
 System.out.println("移位前:a= "+a+" = "+Integer.toBinaryString(a)+"(B)");
 System.out.println("算术右移32:a="+(a>>32)+" = "+Integer.toBinaryString(a>>32)+"(B)");
 System.out.println("逻辑右移32:a="+(a>>>32)+" = "+Integer.toBinaryString(a>>>32)+"(B)");

 System.out.println("算术右移64:a="+(a>>64)+" = "+Integer.toBinaryString(a>>64)+"(B)");
 System.out.println("逻辑右移64:a="+(a>>>64)+" = "+Integer.toBinaryString(a>>>64)+"(B)");

 }

 public static void main(String[] args){
 new Test();
 }

}

运行结果:

=============算术右移 >> ===========
移位前:i= -1073741824 = 11000000000000000000000000000000(B)
移位后:i= -4 = 11111111111111111111111111111100(B)

移位前:j= 201326592 = 1100000000000000000000000000(B)
移位后:j= 12 = 1100(B)

==============逻辑右移 >>> =============
移位前:m= -1073741824 = 11000000000000000000000000000000(B)
移位后:m= 12 = 1100(B)

移位前:n= 201326592 = 1100000000000000000000000000(B)
移位后:n= 12 = 1100(B)

==============移位符号的取模===============
移位前:a= -872415232 = 11001100000000000000000000000000(B)
算术右移32:a=-872415232 = 11001100000000000000000000000000(B)
逻辑右移32:a=-872415232 = 11001100000000000000000000000000(B)
算术右移64:a=-872415232 = 11001100000000000000000000000000(B)
逻辑右移64:a=-872415232 = 11001100000000000000000000000000(B)

3. 为什么没有无符号左移

这个问题大家可以思考一下,应该能想出来。(提示:没有就是没有存在的意思)

以上所述是小编给大家介绍的java中的移动位运算:,>>>详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 深入学习java位运算的基础知识

    相信大家和我一样,接触java这门语言的时候就听过java位运算的鼎鼎大名,当然也仅限于听说过.日常开发过程中使用过么?使用位运算的好处是什么? 想要真正理解java位运算,首先要搞清楚,这个"位"代表的含义. 一切的起源:二进制 位:二进制位,简称"位".是二进制记数系统中表示小于2的整数的符号,一般用1或 0表示,是具有相等概率的两种状态中的一种.二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特(bit). 举个栗子: int占4个字节(

  • 详谈Java中的二进制及基本的位运算

    二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神秘的面纱吧. 一.Java内置的进

  • Java位运算知识点详解

    在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用. 1. 位运算起源 位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来.所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效

  • Java利用移位运算将int型分解成四个byte型的方法

    package 移位运算; public class 移位运算 { public static void main(String[] args) { //00000111 01011011 11001101 00010101 int n=123456789; //n为需要进行移位处理的32位int型初始值 byte[] a =chai(n); for (int i = 0; i < a.length; i++) { byte b=a[i]; System.out.print(b+" &qu

  • Java 通过位运算求一个集合的所有子集方法

    Java没有自带的求一个集合的所有子集的方法,我们可以通过集合的子集规律来求. 一个集合的所有子集等于2^该集合的长度.比如{c,b,a}的长度为3,这个集合的子集就有8个. 这句话看起来很简单,但同时也隐含着高深的哲理.其实一个集合的所有集合,和2^该集合的长度这个数字有关.比如上面的例子,{c,b,a}的长度为3,则可以用0-7表示其所有子集.如下所示,改数字所对应的位置为1,则说明我需要这个数字形成子集.从0-7的二进制表示,刚好代表完,一个长度为3,子集个数为8的所有子集. 0(000)

  • 浅谈java中的移动位运算:,>>>

    1. 概念 << 左移运算符,左移是在后面补0, num << 1,相当于num乘以2 >> 右移运算符, 右移是在前面补1或0,num >> 1, 相当于num除以2 >>> 无符号右移,是在前面补0, 忽略符号位,空位都以0补齐 另外, 不论是左右还是右移32位,相当于不移动,还是原值. 实际上 在java虚拟机执行这句代码的时候如下这样执行的: 5>>(n%32)--->结果 你这里n=32 :所以5>>

  • 浅谈Java中浮点型数据保留两位小数的四种方法

    目录 一.String类的方式 二.DecimalFormat类 三.BigDecimal类进行数据处理 四.NumberFormat类进行数据处理 总结一下 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.String类的方式 该方式是是使用String的format()方法来实现的,该方法的作用就是规范数据的格式,第一个参数传入一个字符串来表示输出的数据格式,如保留两位小数就使用"%.2f",第二

  • 浅谈java中BigDecimal类的简单用法

    一.BigDecimal概述 ​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用

  • 浅谈Java中Unicode的编码和实现

    Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次. 编码方式 字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值."A"是一个字符,"€"也是一个字符.字符集是字符的集合.编码字符集是一个字符集,它为每一个字符分配一个唯一数字. Unicode 最初设计是作为一种固定宽度的 16 位字符编码.也就是每个字符占用2个字节.这样理论上一共最多可以表示216(即65536)个字符.上述16位统一码字符构成基

  • 浅谈Java中方法参数传递的问题

    可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递.在这里,定义方法时,参数列表中的变量,我们称为形式参数. 调用方法时,传入给方法的数值,我们称为实际参数 在Java中调用方法时,如果参数是基本类型(byte/short/int/long/float/double/char/boolean)以及String类型时,形式参数的改变不影响实际参数. 以下代码在内存中发生的动作:

  • 浅谈java中Math.random()与java.util.random()的区别

    今天突然想起来,java产生随机数的问题,上机试了一下,找到了一点区别,在这里总结一下: 直接调用Math.random()是产生一个[0,1)之间的随机数, 如果用 java.util.Random random=new Random();random.nextInt() 这样产生一个长整型的随机数并且与上一次是一样的,如果过一会再产生就不会一样了,例如: for (int i = 0; i < 10; i++) { Random random=new Random(); Thread.sle

  • 浅谈Java中ABA问题及避免

    本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并发栈,代码如下: public class Node { public final String item; public Node next; public Node(String item){ this.item = item; } } public class ConcurrentStack { AtomicReference<Node> top

  • 浅谈Java中的atomic包实现原理及应用

    1.同步问题的提出 假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为1. 我们现在来分析原因,这里为了分析的简单,我们不考虑缓存的情况,实际上有缓存会使结果为1的可能性增大.A线程将内存中的变量i读取到核1算数运算单元中,然后进行加1操作,再将这个计算结果写回到内存中,因为上述操作不是原子操作,只要B线程在A线程将i增加1的

  • 浅谈java中字节与字符的区别

    最近在看Java中的IO相关知识,发现对字节和字符的理解还不够.写篇总结记录一下. 一.字节 所谓字节(Byte),是计算机数据存储的一种计量单位.一个二进制位称为比特(bit),8个比特组成一个字节,也就是说一个字节可以用于区分256个整数(0~255).由此我们可以知道,字节本是面向计算机数据存储及传输的基本单位,后续的字符也就是以字节为单位存储的,不同编码的字符占用的字节数不同. 那么在Java中,除了存储的意义外,Java还将字节Byte作为一种基本数据类型,该数据类型在内存中占用一个字

  • 浅谈Java中File文件的创建以及读写

    1.创建一个文件 @Test public void test6() throws IOException { File file1 = new File("C:\\IDEA\\h1.txt"); if(!file1.exists()){//文件不存在 file1.createNewFile(); System.out.println("创建成功"); }else{//文件存在 file1.delete(); System.out.println("删除成

随机推荐