java中的移位操作

java中的移位操作仅仅对int和long有效,byte、short、char升级为int后再进行移位

移位操作符有>>(右移)、<<(左移)、>>>(右移)三种,注意两点:1.没有<<<符号  2.移位是不循环的

三种的差别是

>>是带符号右移。负数高位补1,正数补0         ----->>>也就是在高位用符号位进行填充。

<<左移无论负数还是正数,在低位永远补0

>>>是不带符号右移,不论负数还是正数,高位补0( 无符号右移。忽略符号位。空位都以0补齐)

在详细的运算中所有转化为补码逻辑进行移位或者按位运算。

測试程序:

[java] view plain copy

  1. public class Shift {
  2. public static void main(String[] args) {
  3. System.out.println("******************正数左移在低位补0*******************");
  4. int a = 1;
  5. a = a << 2;
  6. System.out.println(a);
  7. System.out.println(Integer.toBinaryString(a));
  8. System.out.println("******************正数右移在高位补0********************");
  9. a = 1;
  10. a = a >> 2;
  11. System.out.println(a);
  12. System.out.println(Integer.toBinaryString(a));
  13. System.out.println("******从上面结果能够看出:移位是不循环的*****");
  14. System.out.println("看看负数的移位:");
  15. System.out.println("***********负数的右移操作高位补1**************");
  16. int i = -1;
  17. System.out.println(i + ":");
  18. System.out.println(Integer.toBinaryString(i));
  19. i = i >> 2;
  20. System.out.println(i);
  21. System.out.println(Integer.toBinaryString(i));
  22. System.out.println("**********负数的左移操作低位补0*****************");
  23. i = i << 2;
  24. System.out.println(i);
  25. System.out.println(Integer.toBinaryString(i));
  26. System.out.println("*************再看看>>>操作符*************");
  27. System.out.println("*************负数的>>>操作高位补0***************");
  28. i = -1;
  29. System.out.println(Integer.toBinaryString(i));
  30. i = i >>> 10;
  31. System.out.println(i + ":");
  32. System.out.println(Integer.toBinaryString(i));
  33. System.out.println("*************注意:没有<<<符号**************");
  34. System.out.println("**********byte类型移位时要强转换*************");
  35. byte k = 10;
  36. System.out.println(Integer.toBinaryString(k));
  37. k = (byte) ((byte) k >>> 2);
  38. System.out.println(Integer.toBinaryString(k));
  39. }
  40. }

执行结果:

******************正数左移在低位补0*******************
4
100
******************正数右移在高位补0********************
0
0
******从上面结果能够看出:移位是不循环的*****
看看负数的移位:
***********负数的右移操作高位补1**************
-1:
11111111111111111111111111111111
-1
11111111111111111111111111111111
**********负数的左移操作低位补0*****************
-4
11111111111111111111111111111100
*************再看看>>>操作符*************
*************负数的>>>操作高位补0***************
11111111111111111111111111111111
4194303:
1111111111111111111111
*************注意:没有<<<符号**************
**********byte类型移位时要强转换*************
1010
10

v=d754dcc0.png) !important; background-position: 0px 0px !important; background-repeat: no-repeat;">

v=ba7acbd3.png); background-position: 0px -52px !important; background-repeat: no-repeat;">

v=ba7acbd3.png); background-position: 0px -208px !important; background-repeat: no-repeat;">

时间: 2024-08-06 23:58:36

java中的移位操作的相关文章

java中的位操作、移位操作

在日常开发中,其实位操作.移位操作的使用并不多,主要是其可读性较差,但是在计算密集型操作如一致性哈希计算.hashmap扩容.取数据的交集.差集.并集.权限开关位,位操作.移位操作被广泛使用.因此本文章来介绍Java中的位操作.移位操作,当然LZ特别说明我们的使用场景. 一. 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原码,反码,补码. 1.机器数 我们知道无论是代码还是数值,在计算机中最后都转换成以二进制的形式存在的,而一个数值在计算机中的二进制表

浅谈Java中的补零扩展和补符号位扩展

今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合.但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了.在说之前,我先把代码和答案贴出来吧. 看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个例子. 答案是-127和129.很奇怪不是吗?我想的明明都是-127啊!!! 解答这个问题之前,我们先

Java基础之 移位操作

移位运算符就是在二进制的基础上对数字进行平移.按照平移的方向和填充数字的规则分为三种:    <<(左移).>>(带符号右移)和>>>(无符号右移). 在移位运算时,byte.short和char类型移位后的结果会变成int类型,对于byte.short.char和int进行移位时,规定实际移动的次数是    移动次数和32的余数,也就是移位33次和移位1次得到的结果相同.移动long型的数值时,规定实际移动的次数是移动次数和64的余数,    也就是移动66次和

java中int与byte数组互转代码详细分析

转载请注明出处:http://blog.csdn.net/tang9140/article/details/43404385 在java中,可能会遇到将int转成byte[]数组,或者将byte[]数组转成int的情况.下面我们来思考下怎么实现? 首先,分析int在java内存中的存储格式. 众所周知,int类型在内存中占4个字节,采用补码方式存储(假如对原码.反码.补码不熟悉,请查阅相关资料).举例: 整型-128对应内存中的二进制值为 整型128对应内存中的二进制值为 然后,考虑如何把int

Java中性能优化的45个细节

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问: 控制实例的产生,以达到节约资源的目的: 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信. 2. 尽量避免随意使用静态变量 当某个

java中的三元运算符详解

最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故在此总结,当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 什么是java三元运算符呢?无疑其操作元有三个,第一个是条件表达式,剩余两个为值,条件表达式为真时运算取第一个值,为假时取第二个值. 其示例代码如下:boolean a = 20 < 45 ? true : false

java中BigDecimal的学习

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了. BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算. 当你接触到和钱有关的计算的时候,这个类还是很有用滴. 先来看一个例子 1 package com.tuhooo.bigdecimal; 2 3 /** 4 * Created by tuhooo

Java 中几个重要的关键字

Java中的关键字特别多,大致如下: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface native new static strictfp synchronized transient volatile 程序控制 break continue return do while if else for instanceof switch case default 异常

深入剖析Java中的装箱和拆箱

阅读目录 一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三.面试中相关的问题 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 回到顶部 一.什么是装箱?什么是拆箱? 我们知道 Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成