精华内容
下载资源
问答
  • 这个题目会有多个解法:需要判断n的二进制有几个1first:通过n向右移位&1,如果n的最后为1,那么与1结果为1,(相信大家都会与运算,hashmap就是用与运算)以此来实现,循环判断有多少个1,结束条件为n=0;second...

    这个题目会有多个解法:

    需要判断n的二进制有几个1

    first:通过n向右移位&1,如果n的最后为1,那么与1结果为1,(相信大家都会与运算,hashmap就是用与运算)以此来实现,循环判断有多少个1,结束条件为n=0;

    second:上述方法有一个缺陷,就是当n为有符号数字时,才用n==0的结束条件会发生死循环,那么我们可以通过移位1来实现,也就是有每次比较去把1向左移,一次来比较

    前两种属于常规做法,下面来说一种技巧性的做法

    比如:n=1001,每次将n-1,那么第一次就是1000,使用n&(n-1)→1001&1000=1000,这是第一次计算,第二次1000&0111=0

    两次运算,而1001中有两个1;   如果看不懂的可以自己写写,感受下,就能体会了;

    上代码:

    public void showOne(int n){

    if(n==0){

    System.out.println("0");

    return;

    }

    int count=0;

    while(n!=0){

    count++;

    n=n&(n-1);

    }

    System.out.println(count);

    }

    出处来自剑指offer

    展开全文
  • 32位系统sizeof(int)=4,也就是32位二进制数,内存中是以32位二进制补码的形式存放这数的,int为有符号数,最前面一数字是符号位,0表示正数,1表示负数。 也就是31位存储这数的大小。 正数的补码就是他的...

    32位系统sizeof(int)=4,也就是有32位二进制数,内存中是以32位二进制补码的形式存放这个数的,int为有符号数,最前面一个数字是符号位,0表示正数,1表示负数。

    也就是31位存储这个数的大小。

    正数的补码就是他的原码本身,也就是num%2  ,余数倒叙排列,不够32位的前面补0,

    例如,

    00000000 00000000 00000000 00000001   表示1,

    00000000 00000000 00000011 00000000   表示的是2的9次方+2的8次方=768。

    最大int 

    01111111 11111111 11111111 11111111   表示2的31次方-1=2147483647

    负数的补码是他对应正数的原码的反码,再+1得到的。

    如-1,对应的1的原码 

    00000000 00000000 00000000 00000001

    1的反码    

    11111111 11111111 11111111 11111110

    反码加1为           

    11111111 11111111 11111111 11111111   这也就是内存中-1的存储方式。

    int表示的最大正整数2147483647对应的负数-2147483647的二进制为

    2147483647原码        

    01111111 11111111 11111111 11111111

     反码    

    10000000 00000000 00000000 00000000

    反码+1       

    10000000 00000000 00000000 00000001

    那么int表示的最小的负数也就是 

    10000000 00000000 00000000 00000000  也就是 -2147483648

    知道原理了如何打印一个数的32位二进制码呢?

    1,先用原始的取余倒序排列,设要打印的数位num,

    对于正数,num%2的值也就是第32位,(num/2)%2取余也就是第31位,((num/2)/2)%2也就是第30位……

    定义一个有32个元素的数组a[32]来存放余数,用一个for循环来将余数赋给数组,

    for (i=0;i<32;i++ )

    {

    a[i]=num%2;

    num/=2;

    }

    a[0]存放第32位,a[1]存放第31位 ,  a[2]存放第30位……   打印只要用下面语句倒序打印数组a,就可以了。a[31]a[30].......a[1]a[0]

    for (j=31;j>=0;j--)

    printf ( "%d",a[j] );

    对于负数,他的存储方式也可以看做是,对应正数减去1之后的反码,如-1对应的正数1 减去1也就是0,

    0的原码 

    00000000 00000000 00000000 00000000

       反码    

    11111111 11111111 11111111 11111111  也就是-1的存储方式

    if(num<0)

    {

    num = -num-1;

    for (i=31;i>=0;i-- )

    {

    a[i]=num%2;

    num/=2;

    }

    }

    这里我改变了一下赋值顺序,先将正整数第32位赋给a[31]……也就是a[0]存放第一位,打印的时候顺序打印数组就可以了(对于正数)。我们最终是要打印负数的二进制表示,所以还要取反,可以用下面的语句。

    for (j=0;j<32;j++)

    b[i] = (a[i]+1)%2;

    那么,顺序打印数组b就可以了。

    以下是这种方法的实验图:




    2 用位操作打印。

    用位的左移右移,我们可以将其他位都置0,

    如  10100000 00001100 00000000 00000000我们左移2位再右移31位,就可以直接得到

          00000000 00000000 00000000 00000001       也就是上面的第2个1移到了最后一位,可以得到第30位的值

    每一位都如此操作,我们就可以得到每一位的值0或1,依次打印即可。

     但是对于一个有符号的数,位的操作会使符号一起移动,但是如果符号位为1,你右移之后,符号位会自动补1,

    如10000000 00001111 11110000 00001111  ,我们为了得到第1位的1,直接右移31位,我们预想的结果是

        00000000 00000000 00000000 00000001 ,但实际上,由于符号位为1,每次右移符号位都会自动补1,右移1位

        11000000 00000000 00000000 00000000,右移31位之后会变成

        11111111 11111111 11111111 11111111。

    为了得到想要的结果,我们可以把int赋值给一个unsigned int,这样,就可以用这个方法了。



    可以看到,我用了3种位操作的方法来打印,第3种是我上面讲的,

    第2种也是转换为无符号数,进行了一次位操作;

    第1种是在不转换为无符号数的情况下,进行位操作打印。结果都是正确的。


    展开全文
  • 注:c/c++对有符号整数不适用: class Solution { public static int count1(int n) { int count = 0; while(n != 0) { count += n&1; n >>>= 1; //这里可以改用 n /= 2;但效率低不建议使用...

    法一(逻辑右移):
    注:c/c++对有符号整数不适用:

    class Solution {
    	public static int count1(int n) {
    		int count = 0;
    		while(n != 0) {
    			count += n&1;
    			n >>>= 1;	//这里可以改用 n /= 2;但效率低不建议使用
    		}
    		return count;
    	}
    }
    

    法二:
    二进制有几个一运行几次:

    class Solution {
    	public static int count1(int n) {
    		int count = 0;
    		while(n != 0) {
    			count ++;
    			n &= n-1;	//这里可以改用 n /= 2;但效率低不建议使用
    		}
    		return count;
    	}
    }
    
    展开全文
  • 二进制种编码表示方法

    千次阅读 2013-09-16 17:06:05
    二进制种编码表示方法。  计算机存储数据信息都是以二进制编码存储的,机器内存储的数据的表达形式称为“机器数”,而它代表的数制称为这机器数的“真值”。数正负之分,那么在计算机里怎么表示正负呢,...

    二进制的几种编码表示方法。

            计算机存储数据信息都是以二进制编码存储的,机器内存储的数据的表达形式称为“机器数”,而它代表的数制称为这个机器数的“真值”。数有正负之分,那么在计算机里怎么表示正负呢,0和1不就刚好吗?呵呵,没错,就是用“0”表示正号,“1”表示负号,符号位放在数的最高位。例如,二进制数X=(+1010100),Y=(-1010100),则他们在机器中就存为

             X:

    0 1 0 1 0 1 0 0

             Y:

    1 1 0 1 0 1 0 0


            最左边那一位是符号位,跟它后面的数字一起组成一个数。

     鸡啄米:C++编程入门系列之二(原码、反码与补码)

            为了让计算机计算起来更简单,硬件设计起来也比较简单,人们研究了多种二进制编码方法。其实就是对负数的不同编码,正数基本不变。

    1.原码

            刚才鸡啄米讲到的最高位是符号位,后面是绝对值来表示一个数,这种编码叫做“原码”。但是有个问题,就是0的表示不唯一,+0就是000...0,-0就是1000...0。另外,进行四则运算时,对于符号位都要单独处理,同号怎样运算,异号又怎样运算,有时还需要借位,这对计算机来说是很麻烦的,所以必须找更好的编码方法。

    2.反码

            其实反码不怎么用,但是怎么说是一种编码方式,而且是求补码的中间码,我们还是需要学一下的。

            正数的反码跟原码一样,负数的反码的符号位跟原码一样,但其余各位取反,也就是0变1,1变0。例如,二进制数+1100111的原码是01100111,反码也是01100111,-1100111的原码是11100111,反码则是10011000。

    3.补码

            大家想下,如果现在是7点,但是鸡啄米的表时间是9点,那怎样才能把它调准呢?鸡啄米可以往后调2个小时,也可以往前调10个小时,结果都是9点。这里就涉及到取模运算(以前我们叫求余运算),9-2 = 7,(9+10)%12 = 7,这里的%就是C++里的取模运算符。2与10对模数12是互为补数的。补码就是利用的这个原理,利用补码可以把减法运算变成两个补码相加,具体就是将其变为一个正数和一个负数的加法运算,然后计算这个正数和负数的补码,两个补码相加。因为补码的符号位作为数值参与运算,所以就不存在符号位单独处理的问题。

            正数的原码、反码和补码是一模一样的。

            负数的补码是其反码的最末位加1得到的,我们经常顺口记为负数的补码就是取反加1。

            必须要指出的是补码运算的结果也是补码,还要把它算到原码才得到最后结果。那么知道补码怎么计算原码,很简单,就是对补码再求补码就是源码了。

            鸡啄米给大家个例子:

           10-67 = ?,10的原码是00001010,补码跟原码一样,-67的原码是11000011,补码是10111101。两个补码相加是11000111,这是结果的补码,求原码要对这个补码再求补码,取反加1后就是10111001。

    展开全文
  • 二进制与计算机事物的多少或者顺序,我们可以用一种称为...现在国际通用的主要进位制十进制、二进制、二十进制和六十进制。其中的二进制是计算机通用的进位制。八卦:最早提出的二进制思想中国古人很早就开始使...
  • 本乘法器采用基4booth编码,输入为两128位有符号数,输出为256位有符号数。基4的booth编码将两128位有符号数计算成64部分积。 64部分积经过一层4-2压缩器得到32部分积……在经过层4-2压缩器,最终得到两...
  • //写一个函数求a的二进制(补码)表示中有几个1 //方法一(道理同十进制%10,/10) #include<stdio.h> int count_bit_one(unsigned int i){//无符号整型数可以在输入负数的情况下也可以正确输出 int count=0;...
  • 需要判断n的二进制有几个1 first:通过n向右移位&amp;1,如果n的最后为1,那么与1结果为1,(相信大家都会与运算,hashmap就是用与运算)以此来实现,循环判断有多少个1,结束条件为n=0; second:上述方法有...
  • 十进制转二进制

    2015-04-28 20:40:48
    十进制转二进制种方法 输入:一符号的十进制整数 输出:对应十进制的二进制显示   例如:input=10,output=1010   方法一:除二取余法   Forinput!=0  Cout  Input/=2; End   输出顺序从低位0到高位...
  • 计算机中二进制的计算均是用补码计算的,我们平时所说的二进制通常也是补码,需要注意二进制首位字符为符号位。以下是对这些概念的理解 原码:一整数,转换成二进制数,称为原码; 如:①整数,其数值为9...
  • 二进制的整数如下种形式 原码:直接将一数值转换成二进制。最高位是符号位。 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1. 负数的补码:其反码加一。 最高位是0为正数,为1是负数。 计算机以...
  • 二进制取反运算

    千次阅读 2020-06-27 16:59:27
    这里有几个概念,关于原码、补码和反码 补码:在计算机系统中,数值一律用补码来表示(存储) (正数的补码是其原码。例如十进制数8,其二进制原码表示为00001000,则其补码即为0000 1000。最高位是符号位,这里...
  • 二进制与计算机

    2017-10-24 23:33:35
    二进制与计算机事物的多少或者顺序,我们可以用一种称为“数...现在国际通用的主要进位制十进制、二进制、二十进制和六十进制。其中的二进制是计算机通用的进位制。 八卦:最早提出的二进制思想八卦是中国道家文化的
  • 二进制的加法无外乎就以下种情况, 1+1 = 0 (进位) 1+0 = 1 (无进位) 0+0 = 0 (无进位) 0+1 = 1 (无进位) 仔细一看,在不考虑进位的情况下,这不就是二进制的异或操作嘛。 所以,我们就可以把加法...
  • 二进制与计算机事物的多少或者顺序,我们可以用一种称为...现在国际通用的主要进位制十进制、二进制、二十进制和六十进制。其中的二进制是计算机通用的进位制。八卦:最早提出的二进制思想中国古人很早就开始使...
  • 首先看几个例子: 假设计算机字长为8位 1的原码(8位):0000_0001 反码、补码跟原码一样。 -1的原码(8位):1000_0001 反码 :1111_1110 补码 :1111_1111 0+0和-0之分 +0的原码(8位):0000_0000 反码、补码同...
  • 对于二进制一直不是很感觉,看到了一篇比较好的博文,将二进制输出的算法总结的差不多了, 一起学习一下,原文网址https://www.jb51.net/article/92462.htm 看《编程之美》第二节的时候,它是定义的一整型,...
  • 任意给定一32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了种方法来实现...
  • 任意给定一 32 位无符号的整数 n,计算 n 的二进制表示中 1 的个数,比如 n = 3(011))时,返回 2 这是一到笔试面试经典的题目,下面介绍种解法来实现这一道题目,如果你更好的解法,欢迎指导交流 方法一:...
  • 二进制的世界

    2014-02-11 14:05:46
    源地址:转自answer-huang的博客 ...通常我们接触的几个: >(右移),&(与),|(或), ^(异或),~(非)。通过这些符号,我们可以对变量进行位元运算。   > 左移和右移的功能是移动变量中所有位元,位元向左/向
  • 参考《深入理解计算机系统》 本文从以下几个方面展开:数据类型与二进制整数表示方法浮点数表示方法无符号数与有符号数的转换常见错误:数据溢出,隐式转换反号,移位产生的问题 ...
  • 二进制中 1 的个数

    2020-09-26 01:01:30
    要解决这道题,必须清楚以下几个知识点: 对于位运算符 &,,当两个位同时为 1 时结果为 1,否则为 0 >> 代表有符号右移,>>> 代表无符号右移,<< 代表无符号左移 错误的解法 从 n 的...
  • 二进制中1的个数

    2015-03-30 18:37:50
    问题描述:对于1个字节(8bit)的无符号整形变量,求其二进制表示中1的个数,要求算法的执行效率尽可能的高。 例子:输入7,二进制表示为:0000 0111,...解法1:最直接的解决办法就是把10进制转化为二进制,然后看有几个1
  • (就理解为输入一个十进制数,可以为负数,求其二进制有几个1) public int hammingWeight(int n) 思路:1.使用位运算,n&1,然后无符号右移(>>>)。统计res public int hammingWeight(int n){ //先...
  • 先说明一下几个定义: 最高位为符号位,不参与计算,0...所以为了避免一个值两个补码会造成混乱,就人为将-0规定为-128,对应的二进制1000 0000,同样的-128也就不存在原码和反码一说了。 原码:就是数值的绝对值...
  • 1) 判断二进制中1的个数:输入一整数,输出该数二进制表示中1的个数。其中负数用补码表示。本题两种方法:1. 通过右移操作逐位与1比较判断该位是否为1。考虑到可能出现负数情况,在使用移位操作前需将输入的...
  • 最显着的变体是单界二进制搜索,它对小于100万32位整数的数组执行比标准二进制搜索快2到4倍的速度。 文件中提供了C语言中的源代码实现,该文件中还包含基准标记例程。包含性能结果的图形包含在此页面的底部。请...

空空如也

空空如也

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

二进制有几个符号