资讯专栏INFORMATION COLUMN

java位运算和字节编码(二)

jerry / 257人阅读

摘要:虽然发生了符号位扩展,但是没有任何问题。这就是计算机中原码和补码的奥秘之处。不过等你看懂了就会发现位运算的巧妙之处。这个函数的作用呢其实就是计算整形变量高位连续为零的个数。比如时二进制补码就是原码也就是,那么得到的结果应该是。

上一篇文章我们讨论到byte强制转换成int。然后抛出了一个问题,就是byte直接强制转换成int一定会没问题吗?还是因为上面我们推导的那个例子只是个特例。好吧,正式回答下,一定是没有问题的。虽然发生了符号位扩展,但是没有任何问题。这就是计算机中原码和补码的奥秘之处。

我们来看下JDK中Integer类中的静态方法numberOfLeadingZeros

   public static int numberOfLeadingZeros(int i) {
        // HD, Figure 5-6
        if (i == 0)
            return 32;
        int n = 1;
        if (i >>> 16 == 0) { n += 16; i <<= 16; }
        if (i >>> 24 == 0) { n +=  8; i <<=  8; }
        if (i >>> 28 == 0) { n +=  4; i <<=  4; }
        if (i >>> 30 == 0) { n +=  2; i <<=  2; }
        n -= i >>> 31;
        return n;
    }

乍一看,啥跟啥。完全看不懂。不过等你看懂了就会发现位运算的巧妙之处。这个函数的作用呢其实就是计算整形变量i高位连续为零的个数。比如 i = 1 时 二进制补码就是原码也就是 00000000 00000000 00000000 00000001,那么得到的结果应该是31。这个函数本身有什么用呢,自己去猜吧。好吧,不卖光子了,比如你想知道一个int整形的比1021这个整数更大而且属于2的次方幂。
1 << (32 - (Integer.numberOfLeadingZeros(i - 1))),得到的结果应该是1024。

未完待续 ...
原文链接:http://segmentfault.com/a/1190000003826303

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64636.html

相关文章

  • java运算字节编码(一)

    摘要:正数的原码,反码和补码相同。变量原码反码是符号位不变,其他位取反反码补码则是在反码的基础上加补码所以在计算机中正确的表示应该是。原码反码补码此刻开始转换为类型,占个字节,符号位,用填充高位三个字节。 我们都知道计算机存储的是二进制,长度是8个比特。 byte b = 10; int i = -10; long l = 10L; 那么以上几个变量如何用二进制表示呢?很多人第一印象肯定是 ...

    Dongjie_Liu 评论0 收藏0
  • Java编程基础02——Java语言基础

    摘要:所以就想把一大串缩短点,将二进制中的三位用一位表示。以可以大写也可以小写开头版本可以表示二进制了八进制的数据表现形式由组成。结果把系数基数的权次幂相加即可。因为语言采用的是码来编码的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的...

    pakolagij 评论0 收藏0
  • Java各种数据类型,自己学习写的笔记!!!

    摘要:局部变量声明在函数内部的变量。在作用域范围内不能出现命名冲突。 java编程规范: 1.良好的标识符的命名 保留字不能作为标识符命名: class、public、static..., goto,const 区分大小写:helloWorld、HelloWorld 2.良好的注释习惯 3.良好的缩进:没遇到一个代码块缩进一次(一个tab键) 变量:代...

    stefanieliang 评论0 收藏0
  • killBase系列 -- 密码学(一)

    摘要:系列密码学二传送门密码学一基础密码学算法分类消息编码消息摘要类,类,对称密码非对称密码数字签名五元组明文原始信息。非对称密码包提供给,,等非对称加密算法。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。 前言 最近一场面试,面试官问了我 对称加密与非对称加密的问题,虽然曾经看过一些内容,但是没有系统的整理,所以当被问的时候,脑子里一片空白,没有回答上...

    tomato 评论0 收藏0
  • Java基础语法知识你真的都会吗?

    摘要:而所有的数据运算都是采用补码进行的。补码解决负数加法运算正负零问题,弥补了反码的不足。通过使用访问修饰符可以使实例变量对子类可见暂时在学习基础语法知识的时候可以暂时忽略实例变量这部分内容,这部分内容主要被使用在面向对象的部分,但是极其重要。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242)...

    DirtyMind 评论0 收藏0

发表评论

0条评论

jerry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<