`

java 位操作入门

    博客分类:
  • java
阅读更多
最近有涉及的网络编程方面的工作,对java的位操作算是入门了!
    /**
     * The default byte order of bytes: BIG_ENDIAN
     * 
     * @param bytes
     * @return
     */
    public static final int getUnsignedInt(byte... bytes) {
        switch (bytes.length) {
            case 1:
                return 0xFF & bytes[0];
            case 2:
                return ((0xFF & bytes[0]) << 8) | (0xFF & bytes[1]);
            case 3:
                return ((0xFF & bytes[0]) << 16) | ((0xFF & bytes[1]) << 8) | (0xFF & bytes[2]);
            case 4: {
                int i = ((0xFF & bytes[0]) << 24) | ((0xFF & bytes[1]) << 16) | ((0xFF & bytes[2]) << 8)
                        | (0xFF & bytes[3]);
                if (i > 0)
                    return i;
            }
        }
        throw new RuntimeException("over the max value");
    }

以上代码,隐藏了如下知识点:
1. java中,使用补码的形式来表示二进制的:
  a). 正数的原码、反码和补码是一样的;
  b). 负数的补码有如下规则:原码——>反码——>补码
      原码:负数的原码为1|x|
      反码:负数的反码,符号位不变,数值取反
      补码:负数的反码加1(会影响符号位)
2. java中进行算术和位运算时
  a). 整数存储时,使用的是big-endian字节序列: 高字节在前,低字节在后
  b). 类型会自动按精度从“低”到“高”进行转换,转换的顺序如下:
      byte——>short——>int——>long——>float——>double
  c). 位运算后,byte,short都转换了int类型
// 值为2,这里赋值的就是用的补码形式
int i2 =0x02;
// 值为-2,这里赋值的就是用的补码形式
int i_2 = 0xFFFFFFFE;
        byte b1 = (byte) 0x01;
        byte b_1 = (byte) 0xFF;
        byte b_2 = (byte) 0xFe;
        System.out.println("b_1: " + b_1);
        System.out.println("0x0FF & b_1: " + (0x0FF & b_1));
        
        // -2的补码进行左移后,得到是-256。由于负数补码与原码不一样,因此左移操作后,高位也会发生了变化,再转换成原码计算出的数值就不是预期的 。
        System.out.println("b_1 << 8: " + (b_1 << 8));
        // 终于明白0xFF&的作用了:使用0xFF&是为了确保负整数的高位不变,即为0x000000FF&
        System.out.println("(0xFF & b_1) << 8: " + ((0xFF & b_1) << 8));
        // 但如果操作是正数,则不用0xFF来保证高位不变,是因为正数的补码与原码是一样的,左移操作后,除了低位左移了指定位数外,补码其它高位并没有变化(即都是0)
        System.out.println("b1 << 8 : " + (b1 << 8));

        // 把-1这个数值强制转换成了int型
        int i_1 = b_1;
        System.out.println(i_1 << 8);
分享到:
评论

相关推荐

    java基础入门教程

    4 软 件 最 终 产 品 :用 Java 语 言 开 发 的 软 件 可 以 具 有 可视化 、 可 听 化 、 可 操作 化 的 效 果 ,这 要 比 电 视 、 电 影 的 效果 更 为 理 想 ,因 为 它 可 以做 到 "即 时 、 交 互、 动 画 与 ...

    Java初学者入门教学

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符+ 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

    java 编程入门思考

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符+ 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

    java2入门经典.part01

    java2入门经典.part01 Java2入门经典 图书目录 译者序 序 前言 第一章:Java概述 什么是Java Java语言的特性 学习Java java程序 学习Java要走的路 ava环境 基于Java语言的面向对象程序设计 对象是什么 如何定义...

    java 按位操作符的使用

    在Java中,按位操作符用于对整数进行位级别的操作 按位与(&)操作符 按位或(|)操作符 按位异或(^)操作符 按位取反(~)操作符 左移()操作符 右移(&gt;&gt;)操作符

    Java2入门经典.rar

    对象的操作 Java程序语句 封装 类和数据类型 类和子类 使用对象的优点 Java程序结构 Java的类库 Java应用程序 Java和Unicode码 本章:小结 参考资源 第二章:程序、数据、变量和计算 数据和变量 变量的命名 变量名和...

    Java入门教程(微学苑)-part1

    最好的最简单的Java入门教程。 目录 1 Java概述 1 1.1 Java语言概述 1 1.2 Java虚拟机以及跨平台原理 2 1.3 关于JVM的执行效率 2 1.4 客户端市场的折戟 3 1.5 Java的主要就业方向 3 1.5.1.1 Web开发 3 1.5.1.2 ...

    Java经典入门教程pdf完整版

    Java经典入门教程pdf完整版Java私塾跟我学系列JAⅥ篇网址:htp:/www.lavass.Cn电话:010-86835215 3;Java是一种软件运行平台 3.1:什么是软件的运行平台 如同我们需要阳光、空气、水和食物才能正常存活一样,软件最终要...

    Java加密和数字签名编程快速入门

    和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法: import java....

    java 移位操作符的使用

    Java中的移位操作符用于对二进制数进行左移()、右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;)操作。 左移()操作符:将一个数的所有位向左移动指定的位数,右侧空出的位用0填充。 右移(&gt;&gt;)操作符:将一个数的所有位向右移动...

    Java经典编程300例(完整版+源码

    本书内容包括java语言概述、 ...实例015 加密可以这样简单(位运算) 实例016 用三元运算符判断奇数和偶数 .  实例017 不用乘法运算符实现2×16 实例018 实现两个变量的互换(不借助第3个变量)

    JAVA基础课程讲义

    第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用...

    疯狂JAVA讲义

    3.7.3 位运算符 62 3.7.4 扩展后的赋值运算符 64 3.7.5 比较运算符 65 学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    java联想(中文)

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符+ 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

    Java经典编程源码基础例程300.zip

    实例015 加密可以这样简单(位运算) 20 实例016 用三元运算符判断奇数和偶数 21 实例017 不用乘法运算符实现2×16 22 实例018 实现两个变量的互换 (不借助第3个变量) 23 第4章 流程控制 25 实例019 判断某一年...

    JAVA_Thinking in Java

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符+ 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

    Thinking in Java简体中文(全)

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符+ 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

    Thinking in Java 中文第四版+习题答案

    3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符...

Global site tag (gtag.js) - Google Analytics