精华内容
下载资源
问答
  • (左移、右移、无符号右移)的时候发现十进制数二进制数的时候,负数的位数是够的,比如:负整数 -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,这也是上述代码计算的一个思路,上面的代码比较简单,不妨自己动手玩玩吧!

     

    展开全文
  • bin -> 无符号十进制>> a = convert_bin2dec('101000001', 0); 一 = 321 bin -> 有符号十进制>> a = convert_bin2dec('101000001', 1); a = -191
  • 无符号10进制转换为有符号的十进制,不同于c语言的编写方式。
  • 用c语言写的小程序,功能是将十进制数转换为二进制数
  • 一个简单的二进制转为十进制,包括有符号位和无符号位的两种转换方式。


    为便于理解,不采用自定义函数形式而直接使用主函数main,有需要的自行改写。

    无符号位二进制转换为十进制

    方式一:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #define MAXRANGE 256
    
    int main()
    {
        char binaryScanf[MAXRANGE]; // 无符号字符二进制
        int intBinaryScanf[MAXRANGE];   // 存储每个二进制元素
        long int decimal = 0;
        
        scanf("%s", binaryScanf);   // 输入二进制数
        for(int i = 0, j = strlen(binaryScanf); i < strlen(binaryScanf); i ++)  // 字符二进制逆序转数型
            intBinaryScanf[i] = binaryScanf[--j] - '0';	// 字符变数型
    
        for(int i = 0; i < strlen(binaryScanf); i ++)
             decimal += intBinaryScanf[i] * (int)pow(2,i);     // 进制二转十公式
        printf("%lu\n",decimal);
    
        return 0;
    }
    

    方式二:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    int main(void)
    {
        char str_bin[32];
        gets(str_bin);
        int sizeBin = strlen(str_bin);
        int sum = 0;
        for(int i = 0; i < sizeBin; i ++)
            sum += (int)pow(2,(sizeBin-1-i)) * (str_bin[i] - '0');
        printf("%d",sum);
    	return 0;
    }
    

    运行结果:
    无符号二进制转十进制

    有符号位二进制转换为十进制

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #define MAXRANGE 256
    
    int main()
    {
        char binaryScanf[MAXRANGE]; // 有符号字符二进制
        int decimal = 0;   // 所求十进制
    
        scanf("%s", binaryScanf);   // 输入二进制数
    
        if(binaryScanf[0] == '1')   // 符号位 == 1
        {
        	// 逆补码
            for(int i = strlen(binaryScanf) - 1; i > 0; i --)
            {
                binaryScanf[i] -= 1;
                if(binaryScanf[i] == '0')
                    break;
                else
                    binaryScanf[i] = '1';
            }
            // 逆反码
            for(int i = strlen(binaryScanf) - 1; i > 0; i --)
                binaryScanf[i] == '0' ? (binaryScanf[i] = '1') : (binaryScanf[i] = '0');
            // 二转十公式
            for(int j = 0, i = strlen(binaryScanf) - 1; i > 0; i --)
                decimal += (binaryScanf[i] - '0') * (int)pow(2,j++);
            decimal = 0 - decimal;  // 取负
        }
        else    // 符号位 == 0
            for(int j = 0, i = strlen(binaryScanf) - 1; i > 0; i --)
                decimal += (binaryScanf[i] - '0') * (int)pow(2,j++);
        printf("%d\n",decimal);
        return 0;
    }
    
    

    运行结果:
    有符号位二转十
    符号位 == 0 の处理方法二

    int intBinaryScanf[MAXRANGE];   // 存储每个二进制元素
    
    for(int i = 1, j = strlen(binaryScanf) - 1; i < strlen(binaryScanf); i ++)  // 字符二进制逆序转数型
    	intBinaryScanf[--j] = binaryScanf[i] - '0';	// 字符变数型
    for(int i = 0; i < strlen(binaryScanf) - 1; i ++)
    	decimal += intBinaryScanf[i] * (int)pow(2,i);     // 进制二转十公式
    

    关于二进制转十进制说明

    有符号位二转十:

    1. 判断符号位(最左端)为0或1
    2. 若为1:
    1. 二进制码 - 1(逆补码)
    2. 二进制码 反码,即1变0,0变1(逆反码)
    3. 二进制码公式:除了最左端的符号位,对经前两步处理过的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
    4. 给求和后的数加个负号“-”。
    1. 若为0:

    直接套用二进制码公式:除了最左端的符号位,对当前二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
    有符号位二转十

    无符号位二转十:
    直接套用二进制码公式:对当前的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
    无符号位二转十

    展开全文
  • 本文实现的是将十二位的有符号二进制数转换为十进制数: 由于在数字在显示中,如果高位0会在显示中被省去,所以,这里无法检测到每个的位数都12位,也就是无法全部检测到12位的符号位。 比如: 000011110000...

    实现原理

    本文实现的是将十二位的有符号的二进制数转换为十进制数:

    由于在数字在显示中,如果高位为0会在显示中被省去,所以,这里无法检测到每个数的位数都为12位,也就是无法全部检测到12位的符号位。

    比如: 000011110000, 在显示的时候只会显示: 11110000
    如果此时检测最高位是否为1, 就只会检测到第8位为1,检测为负数。

    所以由于是将12位有符号位的二进制数转换,也就是说,它的范围为:[-2047,2047],正数的最大值: 0111 1111 1111.
    只要检测到输出的值大于211-1, 就进行补码的转换。

    实现代码

    cstr = textread('C:\Users\Documents\0\Qin0.txt','%s');   % 输入txt文件
    m = 12;						% 12 bits
    n = length(cstr);			% 需要转换的数字个数
    Qin0 = zeros(n,1);		
    for i=1:n
        Qin0(i) = bin2dec( cstr{i} );	%将所有二进制数转换为无符号位十进制数
        if(Qin0(i)>2047)					% 如果结果大于2047
                Qin0(i)=bin2dec(cstr{i})-2^m;				% 转换为负数
        end
    end
    

    代码结果:

    输入的12位数字: cstr
    转换后的数字:
    Qin0

    展开全文
  • matlab开发-将二进制字符串转换为十进制值。它将二进制流转换为十进制值,每次8位,尽管您可以更改它。
  • 本文实例讲述了PHP实现十进制二进制、八进制和十六进制转换相关函数用法。分享给大家供大家参考,具体如下: 1.二进制: 1.1.二进制十进制: 函数:bindec(string $binary_string) @param $binary_string 参数...
  • 用汇编语言实现无符号数二进制输入转十进制输出
  • 编写递归函数void DtoB,实现十进制无符号整数到二进制数转换。递归提示:例如,如果要输出13的二进制数1101,可以考虑先递归输出13的前面的三个二进制数110,最后再输出结尾的1。 样例输入:13 样例输出:1101 #...

    编写递归函数void DtoB,实现十进制无符号整数到二进制数的转换。递归提示:例如,如果要输出13的二进制数1101,可以考虑先递归输出13的前面的三个二进制数110,最后再输出结尾的1。
    样例输入:13
    样例输出:1101

    #include <iostream> 
    using namespace std;
    void DtoB(unsigned long num) 
    {
        if(num/2)
        {
            DtoB(num/2);
        } 
        cout<<num%2;
    }   
    int main ( )
    { 
        long a;
        cin>>a;
        DtoB(a);
        return 0;
    }
    展开全文
  • 已知一个只包含 0 和 1 的二进制数,长度不大于 10 ,将其转换为十进制并输出。 输入一个二进制整数n 输出转换后的十进制数, 占一行
  • 十进制转换为其他的进制同理 2进制转换8进制之类的转换可以借助十进制完成,即先转换10进制,然后将10进制转换8进制 可参考 2. 出现的问题 本来想借助函数f2实现将a转换b进制的,由于...
  • package day11;... * 输入一个数字n 输出要求的无符号二进制串 * */ public class BinaryNumber { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int[] binary...
  • 二进制数转换十进制数二进制数转换十进制数
  • 在一些数据处理过程中,需要将一组十进制小数转换二进制数存储或者计算,这种操作在FPGA的使用中会经常遇到。本文分析了十进制小数转换二进制数的方法。 1.N位二进制数的取值范围 N位无符号型(unsigned)取值...
  • 在计算机编程过程中,各种进制的转换很多,二进制转为十进制在C语言中有强制转换的方式。在CAN报文解析的时候,从数据中取出的二进制端,长度可能不是正好一个字节,这个时候如果要求数据是有符号的,需要单独写程序...
  • 把两个无符号的字符,拼接成一个有符号的十进制数,方法是:将高位的字符左移8位,然后位或低8位的字符。 (2)判断符号。单独提取最高位的位。方法:要提取的变量位与0x8000 (3)将补码表示的负数,转成...
  • #include<stdio.h> char trans(unsigned int d,int s){ char digits[]="0123456789ABCDEF"; char buf[17]; int i=16; if(s<2||s>16) return 0; buf[i]='\0'; do { int t; t=d%s; d=d/s;...
  • // 输入二进制数转换为十进制数输出。.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" double cifang (double x, int n) { double sum=1.0 ; int i; for(i=1;i<=n;i++) { sum=x*sum; } ...
  • 在计算机中,通常HEX代表16进制,DEC代表10进制,OCT代表8进制 在Excel或Matlab等软件中,常用XX2XX的表达式进行进制转换,接下来主要展示16进制转换...以FA46例,若是无符号,则范围: 0—65535 ,...
  • 十进制数转化为二进制Java实现 我们先要知道自带包中有这一函数Integer.toBinaryString(int i) 它可以将我们输入的十进制数转化为二进制 public static void main(String[] args) { System.out.println("请...
  • 二进制数据转换十进制数

    千次阅读 2021-01-03 00:05:29
    输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。 输入格式: 输入1个二进制串(至少1位且不超过16位)。 输出格式: 输出转换后的十进制数。 输入样例: 0110110001100 输出样例: 3468 源...
  • 10进制数转换为16位二进制数

    千次阅读 2020-03-29 17:46:32
    测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 144↵ 0000000010010000↵ 1秒 64M 0 题解 本题给出两种解法: 方法一 初中学过,根据对2的求模取余法,可以将一个十进制数转化为二进制数。...
  • 对于刚开始学习C语言的来说,我们知道%d可以表示十进制,%o可以表示八进制的,%x用来表示十六进制的,但却没有来表示二进制数的。 这就是相对应的八进制和十六进制#include &lt;stdio.h&gt; ...
  • 程序功能:将无符号数转换成2~16进制数,将结果输出。
  • 无符号十进制数加法实验 ,与需要看的人赶紧下载,绝对宝贵
  • Excel实现有符号十进制数二进制数

    千次阅读 2017-08-31 18:41:53
    1023~+1023的数据转换为二进制,其实这个问题完全可以通过Matlab编程来解决,但是呢,得到的结果要重新复制进Excel表格中,也没有那么方便,所以想直接用Excel中的公式来进行十进制二进制操作。   Excel中自带...
  • Hello,大家好,我是wangzirui32,今天我们将学习如何将十进制数转换为二进制,八进制,十六进制。 学习目录1. 转换二进制2. 转换八进制3. 转换十六进制 1. 转换二进制 # 任意进制转换为二进制 new_number = bin...
  • 二进制数十进制数

    2014-06-07 17:03:27
    帮研究生同学写的一个数制转换代码,将二进制数据转换为十进制数,需转换的数据格式: 1.每行数据的第一个数为任意数制,仅作为标识,可能正,也可能负,无需转换,直接去除; 2.每行余下的数据为二进制数据,...
  • 请输入需要转换为十进制二进制数字&quot; s1 = str(raw_input()) isBanary = &quot;yes&quot; #记录键盘输入所映射的ASCII码,以免布尔值影响计算 key_down = [] for ele in s1:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,320
精华内容 29,728
关键字:

十进制数转换为无符号二进制