转自:http://blog.163.com/pilgrim_yang/blog/static/55631481201111542151582/

Java对byte 的 + - * / >> >>> << & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题:

 
 
假设我们想进行如下byte运算: 1111 1000 右移1位,再与0000 0001 或运算,得 0111 1101。
直觉写程序如下:
byte b = 0xf8;
byte b2 =  b >> 1 | 0x01;  
 
这个写法里有多重错误,现逐个纠正:
1 编译器报错,int无法直接自动转化为byte 
为解决此问题,加强制转化。
byte b = (byte)0xf8;
byte b2 = (byte)( (b >> 1) | 0x01);  
 
 
2 输出为 1111 1101 不是我们想要的 0011 1101
原因是>> 是有符号右移,当符号位为1时,左侧补的是1而非0。
修改为使用 >>> 无符号右移:
byte b = (byte)0xf8;
byte b2 = (byte)( (b >>> 1) | 0x01);  
 
3 运行后发现输出依然为 1111 1101 
原因是byte在运算前先转化为int再行位运算,因此分解后的运算步骤如下:
b 转化为int  1111 1000 转化为      11111111 11111111 11111111 11111000
无符号右移1位                      01111111 11111111 11111111 11111100
与 0x01 按位或                  01111111 11111111 11111111 11111101
强制转化回byte     11111101
解决方案,在右移运算前先 位与 0xff
byte b = (byte)0xf8;
byte b2 = (byte)( ((b & 0xff )>>> 1) | 0x01);  //注意必须加括号,因为 >>> 的优先级高于 &
 
 
4 运行后发现输出为我们想要的结果  0111 1101。运算步骤分解如下:
b 转化为int  1111 1000 转化为   11111111 11111111 11111111 11111000
和0xff 进行 & 操作              00000000 00000000 00000000 11111000
无符号右移1位   00000000 00000000 00000000 01111100
与 0x01 按位或  00000000 00000000 00000000 01111101
强制转化回byte  01111101
 
 
 
5 关于System.out.println();
byte b = (byte)0xf8;
System.out.println(b);   --最终输出为-8
运算步骤为:
b 转化为int  1111 1000 转化为   11111111 11111111 11111111 11111000
取符号位 -                      -1111111 11111111 11111111 11111000
-1取返(因为是按逆补码运算)      -0000000 00000000 00000000 00001000
输出  -8
 
 
 
 
 
最终结论:
1 区分使用 >> 和 >>>
2 在 >> 操作前要首先 & 0xff
3 注意符号优先级,正确使用括号。
4 需要强烈注意的一点是 & 的优先级小于 + . 因此 a = b & 0xff + 2000 的结果 可能不是你想要的
 
 
 
 
 
 
附:
打印byte,int 每个bit值的函数。
 
public static void printByte(byte b){
    for(int i = 7; i >=0 ; i --){
        int shiftleft = (b >> i) & 0x01;
        System.out.print(shiftleft);
    }
    System.out.println();
}
 
public static void printInt(int b){
    for(int i = 31; i >=0 ; i --){
        int shiftleft = (b >> i) & 0x01;
        System.out.print(shiftleft);
    }
    System.out.println();
}

Java byte 位移操作 注意事项的更多相关文章

  1. Java byte位移操作 注意事项

    Java对byte 的 + - * / >> >>> << & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先 ...

  2. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  3. Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式

    解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...

  4. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  5. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  6. java编写规范及注意事项

    java编写规范及注意事项 1.注释 常见注释有三种  //   /**/ /****/ 如何才能写出漂亮的注释呢,注释的目的就是为了使你的代码让人更容易理解和维护,写一手好的注释是一个优秀码农的基本 ...

  7. 第26章 java进制操作

    java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...

  8. Java中创建操作文件和文件夹的工具类

    Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...

  9. struts2更新版本操作有关事项备注

    struts2更新版本操作有关事项备注, 更新主要jar包:struts2-convention-plugin-version,struts2-core-version, struts2-spring ...

随机推荐

  1. expected expression __bridge

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013020103/article/details/30491117 expected expres ...

  2. PHP设计模式——桥接模式

    <?php /* * 桥接模式 * 使用发送器,将一个类对象传入另一个类作为属性,耦合M+N个类 * */ abstract class Info { protected $_send = NU ...

  3. Java+maven+selenium3+testng 自动化测试环境IDEA

    idea .java环境变量jdk maven安装及环境变量配置这里就不多说了,网上有很多教程 这里我们只检测一下java.maven环境是否安装成功 win+R,运行cmd命令行:mvn -v   ...

  4. 查看flash的版本

    查看当前浏览器的flash版本: http://www.adobe.com/swf/software/flash/about/flashAbout_info_small.swf 针对谷歌浏览器 chr ...

  5. Hibernate Validator数据校验框架常用注释

    使用前先配置maven,加入依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId> ...

  6. Mac使用GNU版本的sed

    今天在mac下用sed试图替换\t ,结果发现不生效,Google之后发现mac作为unix分支的系统上的sed与GNU版本的sed行为不太一致. 使用以下命令安装GNU命令套件: brew inst ...

  7. css的基础用法(上)

    css定义: CSS层叠式样表(Cascading  Style Sheets)是一种用来表现html或xml等文件样式的计算机语言.CSS不仅可以静态的修饰网页,还可以配合各种脚本语言动态地对网页个 ...

  8. spring入门(五) spring mvc+hibernate

    核心是让SessionFactory由Spring管理 1.引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework/sp ...

  9. iOS之网络请求及各类错误代码含义总结(包含AFN错误码大全)

    转自http://blog.csdn.net/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...

  10. 蚯蚓(noip2016,贪心,单调性)

    题目描述 本题中,我们将用符号⌊c⌋ 表示对 c 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3 . 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭 ...