精华内容
下载资源
问答
  • 二进制位运算 左移右移

    千次阅读 2019-08-03 20:11:59
    原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加 1 以-14 举例 原码:14 即 00000000 00000000 00000000 00001110 反码: 11111111 11111111 11111111 11110001 补码...

    (1).二进制中负数的计算

    负数以正数的补码表示

    原码:一个整数按照绝对值的大小转化成二进制的数

    反码:将二进制数按位取反

    补码:反码加 1

    以-14 举例

    原码:14 即 00000000 00000000 00000000 00001110

    反码: 11111111 11111111 11111111 11110001

    补码: 11111111 11111111 11111111 11110010

    所以-14 的二进制是 11111111 11111111 11111111 11110010

    假设 我们得到 二进制让我们求整数 就是倒着来取相反数

    如二进制是 11111111 11111111 11111111 11110010

    得到反码减1 11111111 11111111 11111111 11110001

    原码: 00000000 00000000 00000000 00001110

    即 1110 = 14 所以取反 就是-14

    (2).<<左移运算符

    1.将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)

    (注意:java中 整数位 32位)

    11 << 2 = 44

    -14 <<2 =-56

    -14的二进制(11111111 11111111 11111111 11110010)左移2位 为
    11111111 11111111 11111111 11001000 结果为(-56)
    【补充】:对于左移,直观的理解为,对于正数来说,左移相当于乘以2(但效率比乘法高);对于负数来说,没有直观的理解。

    (3).>>右移运算符

    将一个运算对象的各二进制位全部右移若干位,正数左补0,负数左补1.

    4 >> 2 = 1;

    -14 >> 2 = -4;
    【补充】:对于右移,直观的理解为,对于正数来说,右1移相当于除以2(但效率比除法高);对于负数来说,没有直观的理解。



    作者:Ferrari1001
    链接:https://www.jianshu.com/p/19ed5ff6a945
    来源:简书
     

    展开全文
  • 二进制位运算---左移右移

    千次阅读 2019-11-11 22:03:47
    二进制位运算---左移(<<)右移(>>) (1).二进制中负数的计算 负数以正数的补码表示 原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加 1 以-14 举例 原码...

    二进制位运算---左移(<<)右移(>>)

     

    (1).二进制中负数的计算

    负数以正数的补码表示

    原码:一个整数按照绝对值的大小转化成二进制的数

    反码:将二进制数按位取反

    补码:反码加 1

    以-14 举例

    原码:14 即 00000000 00000000 00000000 00001110

    反码: 11111111 11111111 11111111 11110001

    补码: 11111111 11111111 11111111 11110010

    所以-14 的二进制是 11111111 11111111 11111111 11110010

    假设 我们得到 二进制让我们求整数 就是倒着来取相反数

    如二进制是 11111111 11111111 11111111 11110010

    得到反码减1 11111111 11111111 11111111 11110001

    原码: 00000000 00000000 00000000 00001110

    即 1110 = 14 所以取反 就是-14

    (2).<<左移运算符

    1.将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)

    (注意:java中 整数位 32位)

    11 << 2 = 44

    -14 <<2 =-56

    -14的二进制(11111111 11111111 11111111 11110010)左移2位 为
    11111111 11111111 11111111 11001000 结果为(-56)
    【补充】:对于左移,直观的理解为,对于正数来说,左移相当于乘以2(但效率比乘法高);对于负数来说,没有直观的理解。

    (3).>>右移运算符

    将一个运算对象的各二进制位全部右移若干位,正数左补0,负数左补1.

    4 >> 2 = 1;

    -14 >> 2 = -4;
    【补充】:对于右移,直观的理解为,对于正数来说,右1移相当于除以2(但效率比除法高);对于负数来说,没有直观的理解。

    展开全文
  • 左移右移、无符号右移)的时候发现十进制数转二进制数的时候,负数的位数是够的,比如:负整数 -15 的二进制表示是:11111111111111111111111111110001,但是 正整数 15 的二进制表示是:1111,抱着好奇心,我...

    前言:在 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)的时候发现十进制数转二进制数的时候,负数的位数是够的,比如:负整数 -15 的二进制表示是:11111111111111111111111111110001 ,但是 正整数 15 的二进制表示是:1111,抱着好奇心,我看了一下源码,现分析如下。

    注:玩的是JDK1.7版

    一:请先看一下如下资料,他们解释了计算机中为什么使用二进制表示数据?计算机中正数、零、负数是如何表示的以及为什么?

    1):关于2的补码 (阮大神的佳作,通俗易懂)

    2):[java]负数的二进制编码——越是基础的越是要掌握(这篇也很好,讲解的比较系统)

    3):你真的了解Java中的负数

    4):计算机中二进制数据的编码方式,整理了两篇他人的博客

     

    二:整数的十转二(转八、转十六的底层也是一样),源码如下

       /**
         * Returns a string representation of the integer argument as an
         * unsigned integer in base&nbsp;2.
         *
         * <p>The unsigned integer value is the argument plus 2<sup>32</sup>
         * if the argument is negative; otherwise it is equal to the
         * argument.  This value is converted to a string of ASCII digits
         * in binary (base&nbsp;2) with no extra leading {@code 0}s.
         * If the unsigned magnitude is zero, it is represented by a
         * single zero character {@code '0'}
         * (<code>'&#92;u0030'</code>); otherwise, the first character of
         * the representation of the unsigned magnitude will not be the
         * zero character. The characters {@code '0'}
         * (<code>'&#92;u0030'</code>) and {@code '1'}
         * (<code>'&#92;u0031'</code>) are used as binary digits.
         *
         * @param   i   an integer to be converted to a string.
         * @return  the string representation of the unsigned integer value
         *          represented by the argument in binary (base&nbsp;2).
         * @since   JDK1.0.2
         */
        public static String toBinaryString(int i) {
            return toUnsignedString(i, 1);
        }
    
        /**
         * Convert the integer to an unsigned number.
         */
        private static String toUnsignedString(int i, int shift) {
            char[] buf = new char[32];
            int charPos = 32;
            int radix = 1 << shift;
            int mask = radix - 1;
            do {
                buf[--charPos] = digits[i & mask];
                i >>>= shift;
            } while (i != 0);
    
            return new String(buf, charPos, (32 - charPos));
        }

    很明显,上述代码的核心是 toUnsignedString 方法的do-while循环,从低到高一位一位的确认转成的二进制数是0还是1,当待转换的整数经过无符号右移为0时,则停止循环。

     

    三:改造后的源码,可通过日志信息更为直观的看到进制转换的每一步

    /*
     * @description:进制转换测试类
     * @author:godtrue
     * @create:2018-09-08
     */
    public class NumConvert {
    
        /**
        *
        *@description: 测试的入口方法
        *@param args
        *@return: void
        *@author: godtrue
        *@createTime: 2018-09-08
        *@version: v1.0
        */
        public static void main(String[] args) {
            System.out.println("整数 15 的二进制表示是:"+toBinaryString(15));
            //System.out.println("整数 -1 的二进制表示是:"+toBinaryString(-1));
            //System.out.println("整数  0 的二进制表示是:"+toBinaryString(0));
            //System.out.println("整数  1 的二进制表示是:"+toBinaryString(1));
        }
    
        /***
        *
        *@description: Returns a string representation of the integer argument as an unsigned integer in base&nbsp;2.
        *@param i 待转换十进制整数
        *@return: java.lang.String
        *@author: godtrue
        *@createTime: 2018-09-08
        *@version: v1.0
        */
        public static String toBinaryString(int i) {
            return toUnsignedStringPrintLog(i, 1);
        }
    
        /**
        *
        *@description: Convert the integer to an unsigned number,print log.
        *@param i 待转换十进制整数
        *@param shift 移位的位数,转换进制时使用,用于获取转换进制的基数
        *@return: java.lang.String
        *@author: godtrue
        *@createTime: 2018-09-08
        *@version: v1.0
        */
        private static String toUnsignedStringPrintLog(int i, int shift) {
            char[] buf = new char[32];
            for(int l=0; l<32; l++){
                buf[l]='0';
            }
            int charPos = 32;
            int radix = 1 << shift;
            int mask = radix - 1;
            int loop = 1;
            do {
                buf[--charPos] = digits[i & mask];
    
                StringBuilder logInfoMAndNum = new StringBuilder("[ 二进制 与 操作]\n")
                        .append("[").append("\n")
                        .append("     ").append(toUnsignedStringNoLog(i,1)).append(" 十进制是:").append(i).append("\n")
                        .append("   & ").append(toUnsignedStringNoLog(mask,1)).append(" 十进制是:").append(mask).append("\n")
                        .append("   = ").append(toUnsignedStringNoLog((i & mask),1)).append(" 十进制是:").append((i & mask)).append("\n")
                        .append("]");
                System.out.println(logInfoMAndNum);
    
                StringBuilder logInfoLoopCount = new StringBuilder("[ 第 ")
                        .append(loop).append(" 次循环,转换的二进制数据表示为:").append(new String(buf)).append(" 计算出来的第 ").append(loop++).append(" 位,是:").append((i & mask))
                        .append("]");
                System.out.println(logInfoLoopCount);
    
                StringBuilder logInfoConvertNum = new StringBuilder("[ 将")
                        .append(" ] [ ").append(i)
                        .append(" ] [ ").append("无符号右移 1 位,结果如右所示")
                        .append(" ] [ ").append(toUnsignedStringNoLog(i,1)).append("(十进制是:").append(i).append(")").append(" >>> ").append(shift).append(" = ").append(toUnsignedStringNoLog((i >>> shift),1)).append("(十进制是:").append((i >>> shift)).append(")")
                        .append(" ]\n\n\n");
                System.out.println(logInfoConvertNum);
    
                i >>>= shift;
    
            } while (i != 0);
    
            return new String(buf);
        }
    
        /**
        *
        *@description: Convert the integer to an unsigned number,not print log.
        *@param i 
        *@param shift
        *@return: java.lang.String
        *@author: godtrue
        *@createTime: 2018-09-08
        *@version: v1.0
        */
        private static String toUnsignedStringNoLog(int i, int shift) {
            char[] buf = new char[32];
            for(int l=0; l<32; l++){
                buf[l]='0';
            }
            int charPos = 32;
            int radix = 1 << shift;
            int mask = radix - 1;
            do {
                buf[--charPos] = digits[i & mask];
                i >>>= shift;
            } while (i != 0);
    
            return new String(buf);
        }
    
        /**
        *
        *@description: All possible chars for representing a number as a String
        *@param null
        *@return:
        *@author: godtrue
        *@createTime: 2018-09-08
        *@version: v1.0
        */
        final static char[] digits = {
                '0' , '1' , '2' , '3' , '4' , '5' ,
                '6' , '7' , '8' , '9' , 'a' , 'b' ,
                'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
                'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
                'o' , 'p' , 'q' , 'r' , 's' , 't' ,
                'u' , 'v' , 'w' , 'x' , 'y' , 'z'
        };
    }
    [ 二进制 与 操作]
    [
         00000000000000000000000000001111 十进制是:15
       & 00000000000000000000000000000001 十进制是:1
       = 00000000000000000000000000000001 十进制是:1
    ]
    [ 第 1 次循环,转换的二进制数据表示为:00000000000000000000000000000001 计算出来的第 1 位,是:1]
    [ 将 ] [ 15 ] [ 无符号右移 1 位,结果如右所示 ] [ 00000000000000000000000000001111(十进制是:15) >>> 1 = 00000000000000000000000000000111(十进制是:7) ]
    
    
    
    [ 二进制 与 操作]
    [
         00000000000000000000000000000111 十进制是:7
       & 00000000000000000000000000000001 十进制是:1
       = 00000000000000000000000000000001 十进制是:1
    ]
    [ 第 2 次循环,转换的二进制数据表示为:00000000000000000000000000000011 计算出来的第 2 位,是:1]
    [ 将 ] [ 7 ] [ 无符号右移 1 位,结果如右所示 ] [ 00000000000000000000000000000111(十进制是:7) >>> 1 = 00000000000000000000000000000011(十进制是:3) ]
    
    
    
    [ 二进制 与 操作]
    [
         00000000000000000000000000000011 十进制是:3
       & 00000000000000000000000000000001 十进制是:1
       = 00000000000000000000000000000001 十进制是:1
    ]
    [ 第 3 次循环,转换的二进制数据表示为:00000000000000000000000000000111 计算出来的第 3 位,是:1]
    [ 将 ] [ 3 ] [ 无符号右移 1 位,结果如右所示 ] [ 00000000000000000000000000000011(十进制是:3) >>> 1 = 00000000000000000000000000000001(十进制是:1) ]
    
    
    
    [ 二进制 与 操作]
    [
         00000000000000000000000000000001 十进制是:1
       & 00000000000000000000000000000001 十进制是:1
       = 00000000000000000000000000000001 十进制是:1
    ]
    [ 第 4 次循环,转换的二进制数据表示为:00000000000000000000000000001111 计算出来的第 4 位,是:1]
    [ 将 ] [ 1 ] [ 无符号右移 1 位,结果如右所示 ] [ 00000000000000000000000000000001(十进制是:1) >>> 1 = 00000000000000000000000000000000(十进制是:0) ]
    
    
    
    整数 15 的二进制表示是:00000000000000000000000000001111
    
    Process finished with exit code 0

     仔细看上述代码及日志信息,可比较清楚的看到JDK是怎么将十进制的数据转换为对应的二进制数据的,核心还是通过 toUnsignedString 方法的 do-while 循环,从低到高一位一位的确认转成的二进制数是0还是1,当待转换的整数经过无符号右移为0时,则停止循环,因为再继续循环通过0和其他数据相与时总是为0的。可以调整上述测试代码类中的测试参数,查看相应的数据转换情况。

    十进制数据 转换为 二进制数据 的逻辑是:将十进制的数据除以二,首先取余数作为二进制的第一位(从右到左,由低到高,左低右高),然后再用得到的商再除于二,再取余数作为二进制的第二位,以此类推,直到除不尽为止即商为0,比如:15转换为二进制数据

    15/2=7 余数为1

    7/2=3 余数为1

    3/2=1 余数为1

    1/2=0 余数为1

    则对应的二进制数为 1111,如果是32位的整数,则将其余的位数补0 ,则15(十进制形式)= 0000 0000 0000 0000 0000 0000 0000 1111(二进制形式)

     

    如果是 -15,转换为二进制,其步骤入下:

    第一步:取负数的绝对值 |-15| = 15

    第二步:将15转换为二进制,15(十进制形式)= 0000 0000 0000 0000 0000 0000 0000 1111(二进制形式)

    第三步:取反 0000 0000 0000 0000 0000 0000 0000 1111(二进制形式)= 1111 1111 1111 1111 1111 1111 1111 0000(二进制形式)

    第四步:加一 1111 1111 1111 1111 1111 1111 1111 0000 +1 = 1111 1111 1111 1111 1111 1111 1111 0001 ,所以,-15 = 1111 1111 1111 1111 1111 1111 1111 0001

    负数 通过 无符号右移一位 之后,会变成比较大的一个正整数,这个正整数往往需要经过32次无符号右移一位,才能变成0,这也是上述代码计算的一个思路,上面的代码比较简单,不妨自己动手玩玩吧!

     

    转载于:https://www.cnblogs.com/godtrue/p/9596446.html

    展开全文
  • 十进制无论转换成二进制还是十六进制本质其实大致相同。 其本质就是利用类似移位操作的方式...我们通过左移思想是 *2 的思想 ,将其转换成某些二进制数字根据其分布形式能够得到十进制13的结果;如果我们最低位 为...

    十进制无论转换成二进制还是十六进制本质其实大致相同。

    其本质就是利用类似移位操作的方式,只是移位单位不同而已。转换成为二进制相当于移位运算;我们知道每次右移相当于 /2 ,左移相当于* 2 ;故我们的十进制转换成二进制不过是转换成二进制的移位方式。

    如:十进制数字 13 

    我们通过左移思想是 * 2 的思想 ,将其转换成某些二进制数字根据其分布形式能够得到十进制13的结果;如果我们最低位 为1的话说明这个二进制数字的十进制表示为1;如果次低位为1的话,说明这个二进制数字的十进制表示为2;同理我们可以追溯到13到底是怎么组合而成的。即13 = 8 + 4 + 1;也就是 二进制1101形式;但是这样回溯的方式还是比较麻烦,我们需要仔细推倒;但是我们不难发现这个方式能够成功的组成十进制数字的关键在于 *2;那么我们通过*2的方式由 1101推倒到了13,同理我们可以通过 / 2 的方式 由 13 推倒到 1101这是不难的。

    那么我们来尝试 / 2 操作(记住这里是计算机的除法运算,而且是整数除法的计算)

    13 / 2 ------------>  商   6         余  1

    6 / 2 --------------> 商   3          余  0

    3 / 2 --------------->商   1          余  1

    1 / 2 ---------------> 商  0          余  1

    因为除法与乘法之间是相逆的,最下面的除法必定是最上面的乘法;并且我们知道数法法则  被除数 = 除数 * 商 + 余数 这个相对于一个独立个体而言,而上述我们将这个独立个体分为了 13 、6 、 3 、 1 的阶梯话形式,并且最终使得商变为0;就是因为这个阶梯话的过程,使得我们必须按照一步一步的方式逆反获得原来的值;这时就跟每个阶梯话产生的因素有关了,即阶梯的坡度---因为是/2 操作我们阶梯的坡度不难想象是2;同理如果是16进制的话那么坡度就是16。这时候我们逆反的推倒的话,根据第一句的话,我们知道最先面的 1 / 2 -------------> 商 0 的操作是除了最多次的,这时候们就需要乘以做多次。那么次数是多少呢?不难由除数的商是小于 被除数 大于 0得出 我们在除法过程中最终的底层为1,那么可以得出最底层的结果是不会大于除数本身的即除数 <= 2 ^ 0 ;那么不难知道上述的最高层是多次*2 了 ,最多3次;这样我们将所得到的向上阶梯展示出来就是这样 1101 (左高右低)---->其十进制结果正好是13;

     

    同理对于十六进制而言,只是阶梯的梯度不同而已;

     

    展开全文
  • 原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加 1 求负数的二进制数 以-14 举例 原码:14 即 00000000 00000000 00000000 00001110 反码: 11111111 11111111 11111111 ...
  • 二进制的最高位是符号位(整数是0,负数是1) Java中没有无符号数 计算机以整数的补码进行计算 原码:将一个整数转换为二进制 以int类型为例,int类型在Java中是4个字节,32位 例如: 2 的原码:00000000 00000000...
  • 3二进制位数统计:依次从二进制尾端判断当前位置的0-1情况(利用与pos&1操作),当判断倒数第二位时候(&10),倒数第三位(&100)。。。,即每次1左移1位。 4 flag的移位为程序构建的循环终止条件(3
  • ———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————自己敲得一些代码,来更好地了解左移右移运算,并且将10进制整数转换为2进制输入。
  • Java负整数左移右移、无符号右移。正数的位移没有涉及到符号,而且正数的原码、反码、补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆。Java的<...整数-3的二进制原码为 100...
  • 计组随笔 —— 二进制乘除法运算❝电子档笔记整理,只是笔记,不是教程。❞目录计组随笔 —— 二进制乘除法运算目录1. 定点数一位乘法1.1 定点原码一位乘法1.2 定点补码一位乘法(布斯公式)2. 二进制除法运算2.1 定点...
  • 然后这题用到了一个方法Integer.toBinaryString() 可以将十进制转成二进制。 0.0 那就不用自己写了因为肯定也写得很垃圾。 关于这个方法有时间可以看看这个->别人的方法探究 以下 public class Problem32 { ...
  • Java负整数左移右移、无符号右移。正数的位移没有涉及到符号,而且正数的原码、反码、补码都是一样的,所以相对简单,但是对于负...整数-3的二进制 原码为 10000000 00000000 00000000 00000011 反码为1111...
  • Java负整数左移右移、无符号右移。正数的位移没有涉及到符号,而且正数的原码、反码、补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆。Java的<...整数-3的二进制原码为 100...
  • Java负整数左移右移、无符号右移。正数的位移没有涉及到符号,而且正数的原码、反码、补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆。Java的<...整数-3的二进制原码为 100...
  • Tape也叫“带” 在状态转换的时候需要遵照一定的规则 ...如何使用图灵机实现二进制非负整数加一 图灵机实现如下 第一行 认为图灵机是向左的状态 若为1则翻转为0 第二行 向左运动的时候碰到的第一个0 这个0置1 然后
  • c++中整数在内存中的存储(左移右移)

    千次阅读 2014-09-30 10:29:23
    整数的正数,负数,以及无符号整数的表示方法有什么区别呢 对于正整数来说,内存里装的就是它自己的二进制码;
  • 题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路:刚开始想法是,不断的进行右移进行与1与运算的话,我们的题目就可以解决了这个问题! 但是我们的负数的时候,进行右移位算术...
  • title: 输入一个int型数据a,统计a的二进制中1的个数 thought: 利用“位运算”,与1进行“与运算&... 方法二:依次将1左移一位,与二进制数做“与操作”,统计结果等于1的个数  (时间复杂度0(n)n是二进制
  • //左移运算符是用来将一个数的各二进制位全部左移若干位。相当于乘法运算,表示为"&lt;&lt;" //右移运算符是用来将一个数的各二进制位全部右移若干位。相当于除法运算,表示为"&gt;&...
  • 位运算符: &(按位与)、|(按位或)、... 按位与:两数对应的二进制数位相与,两数位都为1时,该结果位才为1,否则为0。 例如:3 & 5 == (0000 0011 & 0000 0101== 0000 0001)== 1 2、 |...
  • 下面展示一些 内联代码片。 #include<stdio.h> main(){ unsigned short a,b;... //a的倒数第左移4位并与b相加赋值给b b += (a & 0X0F00) >> 4;//a的倒数第三位右移4位并与b相加赋
  • 对于有符号整数和无符号整数左移右移运算是不同的。 (1)对于无符号整数,左移和右移运算都是逻辑移位。 (2)对于有符号整数,比如int类型: 左移是逻辑移位;右移是算术移位,即:按二进制形式把所有数字向右...
  • 逆序整数二进制

    2016-03-27 00:21:11
    int i=43261596; System.out.println(Integer.toBinaryString(i)); i=((i&0xaaaaaaaa)>>1)|((i&...//取奇右移 ,取偶左移,每2个 i=((i&0xcccccccc)>>2)|((i&0x33333333)2);//每4个 i=((i&0xf0f0f0f0)>>4)|((i&0x0f0f
  • 程序中的所有数都是以二进制的形式存在的,位运算就是直接对整数在内存中的二进制数进行位的操作运算,二进制从右往左,0为开始位。 含义 运算符 实例 与运算(同时为1取1) & 1010 & 1001=1000 或...
  • 算法描述:通过按位与获取整数的奇数位和偶数位,将偶数位右移一位,奇数位左移一位,两者按位异或,得到结果。 import java.util.Scanner; public class Test3 { ... * 将整数二进制奇偶位互换 */ ...
  • java 判断整数二进制中1的个数

    千次阅读 2016-03-20 22:55:30
    解法1:考虑到输入的整数可能是负数,所以不能使用右移运算,这里可以采取左移运算。这个解法中循环的次数等于整数二进制的位数。比如java int类字节为32位,则要循环32次public int numberOf1(int n){ int count =...
  • 面试题:二进制中1的个数// 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如// 把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。世界上有10种人,一种人知道二进制,而另一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 543
精华内容 217
关键字:

二进制整数左移右移