精华内容
下载资源
问答
  • 二进制数前面加0
    千次阅读
    2020-11-21 02:31:31

    来自公众号:Python哦编程吧 作者:小灰辉

    今天有一位刚刚大一的读者私信我说:如何通过Python实现用户输入整数,让程序输出二进制数的补码呢?

    我看到的第一反应是不管题目难不难都应该先去了解关于问题的计算方法和解决办法,比如这里我们需要知道如何计算补码,正数的补码以及负数的补码。当然了正数的补码也就是原码了,那如何输出负数的补码呢?

    我们都知道计算机处理数据的方式无论是计算还是储存或是传输都是以二进制数的形式来完成的。Python中有自己的函数来计算二进制、八进制以及十进制,如:bin()函数将十进制数转换成二进制数,oct()函数将十进制数转换成八进制数,hex()函数将十进制数转换成十六进制数。

    案例:>>>Bin(10)

    ‘0b1010’

    >>>oct(10)

    ‘0o12’

    >>>hex(10)

    ‘0xa’

    同样int()函数可以把二进制、八进制和十六进制转换成十进制类型。

    案例:>>>int(‘1010’,2)#’1010’说明要进行转换的数字,记得用引号引主。2用来说明前面的1010是什么进制数.

    10

    >>>int(‘77’,8)

    63

    >>>int(‘4a’,16)

    74

    言归正传,介绍了一些函数的使用之后,对于开头的题目其实就很容易解决了,程序如下:#获取用户输入十进制数(整数)

    dec = int(input('输入数字:'))

    print('转换为二进制数为:',bin(dec).replace('0b',''))#replace()是bin()函数的一个方法,用于去掉输出时前面带有的'0b'。

    print('转换为二进制数的补码为:',bin(2**8+(dec)))#补码的计算方法

    三行代码就可以实现用户输入数字-->转换成二进制数->输出对应的补码,可见Python的强大及简洁的特性,关于Python的更多特性可以阅读一文读懂Python的前世今生。

    更多相关内容
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。1) 二进制二进制0 和...

    C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

    二进制数、八进制数和十六进制数的表示

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    1) 二进制

    二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头,例如:

    //合法的二进制

    int a = 0b101; //换算成十进制为 5

    int b = -0b110010; //换算成十进制为 -50

    int c = 0B100001; //换算成十进制为 33

    //非法的二进制

    int m = 101010; //无前缀 0B,相当于十进制

    int n = 0B410; //4不是有效的二进制数字

    读者请注意,标准的C语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    下面是实际测试的结果:

    Visual C++ 6.0 不支持。

    Visual Studio 2015 支持,但是 Visual Studio 2010 不支持;可以认为,高版本的 Visual Studio 支持二进制数字,低版本的 Visual Studio 不支持。

    GCC 4.8.2 支持,但是 GCC 3.4.5 不支持;可以认为,高版本的 GCC 支持二进制数字,低版本的 GCC 不支持。

    LLVM/Clang 支持(内嵌于 Mac OS 下的 Xcode 中)。

    2) 八进制

    八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o),例如:

    //合法的八进制数

    int a = 015; //换算成十进制为 13

    int b = -0101; //换算成十进制为 -65

    int c = 0177777; //换算成十进制为 65535

    //非法的八进制

    int m = 256; //无前缀 0,相当于十进制

    int n = 03A2; //A不是有效的八进制数字

    3) 十六进制

    十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头,例如:

    //合法的十六进制

    int a = 0X2A; //换算成十进制为 42

    int b = -0XA0; //换算成十进制为 -160

    int c = 0xffff; //换算成十进制为 65535

    //非法的十六进制

    int m = 5A; //没有前缀 0X,是一个无效数字

    int n = 0X3H; //H不是有效的十六进制数字

    4) 十进制

    十进制由 0~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

    二进制数、八进制数和十六进制数的输出

    C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

    short

    int

    long

    八进制

    %ho

    %o

    %lo

    十进制

    %hd

    %d

    %ld

    十六进制

    %hx 或者 %hX

    %x 或者 %X

    %lx 或者 %lX

    十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

    %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;

    %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

    八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果你比较叛逆,想使用大写形式,那么行为是未定义的,请你慎重:

    有些编译器支持大写形式,只不过行为和小写形式一样;

    有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。

    注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。考虑到读者的基础还不够,这里就先不讲这种方法了。

    【实例】以不同进制的形式输出整数:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=126, b=2713, c=7325603

    a=86, b=1483, c=1944451

    a=56, b=5cb, c=1dab83

    a=56, b=5CB, c=1DAB83

    从这个例子可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

    输出时加上前缀

    请读者注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

    对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。

    对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。

    对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

    区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=0126, b=02713, c=07325603

    a=86, b=1483, c=1944451

    a=0x56, b=0x5cb, c=0x1dab83

    a=0X56, b=0X5CB, c=0X1DAB83

    十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

    C语言中的二进制数、八进制数和十六进制数相关教程

    展开全文
  • 十进制转换为二进制、八进制、十六进制 从十进制向其它进制转换,用的是就用该数字不断除以要转换的进制,读取余数。连接一起就可以了。 复制代码 代码如下: <?php /** *十进制转二进制、八进制、十六进制 不足...
  • C语言printf如何输出二进制数格式?如何将十进制二进制数输出?C语言printf二进制输出字符的格式是什么?C语言可以二进制输出吗?C语言printf打印没有提供二进制格式化输出转换说明,需要自定义实现输出二进制数...

    C语言printf如何输出二进制数格式?如何将十进制数按二进制数输出?C语言printf二进制输出字符的格式是什么?C语言可以二进制输出吗?

    C语言printf打印没有提供二进制格式化输出转换说明,需要自定义实现输出二进制数格式,实现的算法主要是使用移位操作符,使用&与位操作,将1与各位比较提取各位出来,具体的实现算法如下:

    void print_bin(int number);

    void print_bin_simple(int number);

    int main(void){

    int number = 0xAF01BC;

    print_bin(number); // 完全位二进制数格式输出

    print_bin_simple(number); // 去掉前面无效0二进制数格式输出

    return 0;

    }

    /*

    * 二进制数格式输出,输出所有位

    * 6bit

    * 011010

    * 100000 1<<5

    * &

    * */

    void print_bin(int number){

    int bit = sizeof(int)*8;

    int i;

    for(i = bit - 1;i >= 0;i--){

    int bin = (number & (1 << i)) >> i;

    printf("%d", bin);

    }

    printf("\n");

    }

    // 二进制数格式输出,输出有效位,过滤掉前面的0位

    void print_bin_simple(int number){

    int bit = sizeof(int)*8;

    int i;

    int status = 0;

    for(i = bit - 1;i >= 0;i--){

    int bin = (number & (1 << i)) >> i;

    if(bin == 1)

    status = 1;

    if(status == 1)

    printf("%d", bin);

    }

    printf("\n");

    }

    展开全文
  • Java 基本类型与二进制数位的本质

    千次阅读 2021-03-01 06:48:15
    1.Java中的基本类型以二进制补码的形式表示,最高位为符号位:如12, 用二进制表示为:0000 1100而-125, 用二进制表示为:1000 0011另补充原码,反码,补码的含义:原码:将一个整数,转换成二进制,就是其原码。...

    1.Java中的基本类型以二进制补码的形式表示,最高位为符号位:

    如12,  用二进制表示为:0000 1100

    而-125, 用二进制表示为:1000 0011

    另补充原码,反码,补码的含义:

    原码:将一个整数,转换成二进制,就是其原码。

    如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

    反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。

    如单字节的5的反码为:0000 0101;-5的反码为1111 1010。

    补码:正数的补码就是其原码;负数的反码+1就是补码。

    如单字节的5的补码为:0000 0101;-5的原码为1111 1011。

    2.整数的移位操作会默认先转型为4字节int或8字节的long,然后再运算.

    写一个二进制数:0xAF,默认它是int类型,如果把它赋值给一个byte:

    byte = 0xAF,(二进制为1010 1111) 它会出错,因为byte可以表示的数的范围为-128至127,而0xAF默认作为int看待是175,显然超出了它的范围。

    但0xAF确实是一个字节的宽度,按道理讲它是可以放进一个字节里的。如果要把它存入一个byte,必须把它从默认的int转为byte:

    byte b = (byte) 0xAF  // 1010 1111

    这样就相当于把int前面的三字节截断了,此时把它当作是一个有符号的一字节的数来看,首位为1表示是负数,而且特别注意它是补码的表示形式,把它

    还原为原码后可以得出它表示的数为-81.

    总结:一串二进制数,它在计算机中存放时,它的形式虽然没有变化,但是把它当作不同的类型来解读,它表示的数据是不一样的,如上所示,一串

    1010 1111,把它看作是int它表示的是175,把它看作byte,它可以表示为-81.

    3.还是以上二进制串1010 1111,把它存放在一个byte中:

    byte b = (byte) 0xAF

    此时如果要把它解释为一个int型的数,即在它左边扩展3个0字节,凑足4个字节,把它当作int整型来解读,如果再把它强制类型转换:

    int a = (int) b

    但此时a还是等于-81,不是我们所愿的,这是因为第一步已经确认解读它为一个字节的有符号数了,值是确定的,再转型为int时,它是包含在int表示范围内的。

    相当于把它赋值给a。

    但如果我们还是想把一个字节的内容解读为一个int值或者一个无符号的数呢?应该怎么做?

    其实此时应该把一个字节先扩展为int的四个字节,然后去掉它的前导符号位1:

    int a = b & 0x000000FF //注意byte b在逻辑运算之前会默认转型为int:0xffffffaf (-81的补码),类型提升时符号位的1会一直扩展到最高位,

    而逻辑与会去掉符号位和前导的一串1, 此时a就是一个无符号数了,值为175.

    参考:

    http://download.csdn.net/download/aggrision/2372349

    http://blog.163.com/zhuowh2006@126/blog/static/10182372420127189208459/

    http://www.cnblogs.com/dolphin0520/archive/2012/10/09/2711768.html

    展开全文
  • 我们大家学过,或者了解过计算机的都知道,在我们计算机中输入的是十进制,存储的是二进制数,然后输出的又是十进制。 这个过程无非就是二进制转十进制,十进制转二进制。 那么,这种算法又是怎么规定的呢? ...
  • php教程/***十进制转二进制、八进制、十六进制 不足位数前面补零*** @param array $datalist 传入数据array(100,123,130)* @param int $bin 转换的进制可以是:2,8,16* @return array 返回数据 array() 返回没有数据...
  • C++二进制数转十进制

    千次阅读 2022-04-10 00:31:59
    这个代码是我在前面一个判断一个整数是几位数的基础上进行的进一步拓展。都是小白文章,还请大佬多多指教。
  • Python获取数字的二进制

    千次阅读 2020-12-17 11:25:09
    二进制的表示首先在Python中可以通过以"0b"或者"-0b"开头的字符串来表示二进制,如下所示由此可知我们用二进制表示的数字在打印之后会变成我们更为熟悉的十进制,更容易被人理解。当我们需要看十进制数字的二进制...
  • 将十进制转换成二进制形式(比较复杂)下面用递归方式来实现将十进制转换成二进制形式的字符串,在编写这个程序之前,必须先了解熟知的进制表示原理,同样一个数值,可以用多种进制进行表示,就好比同样的钱,可以...
  • C语言标准中,整数可以直接使用八进制、十进制、十六进制三种表示,二进制标准没有支持...二进制二进制数是由0和1组成的,表示时需要在前面加上0B或0b(不区分大小写) 如int a=0b1011 int a=0b10111 注意:标准的C
  • 每次得到的都进入到等号右边的s中,那么第二个余数就是num%2,在s的前面,这就是字符串的拼接,切记不能交换两者的位置。 八进制: 同二进制一样 十六进制: 十六进制不外乎就是写一个数组: char[] arr = {...
  • 最近在用Python写遗传算法时,发现需要将十进制的整数转换成二进制数,那么怎么来转换呢?当然如果你学过进制转换的有关计算方法,你可以手动编写一些函数来实现,不过总体来说还是比较麻烦的,这里介绍Python内置的...
  • 今天小编就为大家分享一篇java 二进制数据与16进制字符串相互转化方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 二进制加减运算

    千次阅读 2021-09-11 23:41:24
    二进制加法原则是:2个1相加等于2就要向前给1,下面得算为0,相当于十进制1+9=10向前给1,下面得算为0,因为二进制只有0和1 ,所以11等于2多了一个1就要往前送。 二进制减法原则是:0减1不够,就向前借2减1 1...
  • 二进制数的表示方法

    千次阅读 2020-11-20 16:42:18
    机器最高为符号位,0正1负。 X=-0.1011,[X]原=11011 ,小数点默认在符号位之后,书写时将其省略。 补码 [X]补=[X]原(X>0) [X]补=[X]原除符号位取反1(X<0) [+0]补=[-0]补=0.0000 补码加法运算 补码...
  • 10进制转换为16位二进制数

    千次阅读 2020-03-29 17:46:32
    写在前面: 题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在...
  • 十进制转二进制

    2021-06-24 12:40:04
    十进制转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制的整数部分和小数部分分别转换后,再加以合并。中文名十进制转二进制外文名Decimal system to binary system适用领域电子、编程、编码...
  • 这些只是表示方法不同,但是它们表示的含义是一样的,如二进制中的 11 和十进制中的 3 是一样的。 Python 二进制表示法 如十进制中的 100 用二进制表示就是 1100100,那么 100 就可以用 0b1100100 来表示。 a...
  • 在想要使用二进制数的代码最前面加上 #include "cvt_bin2hex.h" 即可
  • 那么我们会发现,10%2是判断二进制数的最后一位是0还是1,判断完成后向右移一位即10/2得到5,接着5%2判断二进制数的倒数第二位是0还是1,判断完成后向右移一位即5/2得2,重复这个过程,直到0/2结束。最终我们得到了...
  • 摘要:本文将会说明有符号的表示方法,有符号正负数之间的跳变,有符号负数的减法,为什么采用补码等方面进行分析。 我是学过计算机原理的,也有有符号和无符号的概念,以及正码、反码、补码的概念。可是...
  • 一、十进制整数转其它进制(除基取余法) 二、十进制小数转其它进制(乘基取整法) 三、十六进制转二进制 四、八进制转二进制
  • 关于这点其实很多人一知半解,今天特此做一个梳理。 首先看几个例子: 假设计算机字长为8位 1的原码(8位):0000_0001...0有+0和-0之分 +0的原码(8位):0000_0000 反码、补码同。 -0的原码(8位):1000_0000 反码 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,821
精华内容 193,128
热门标签
关键字:

二进制数前面加0