二进制负数用补码表示

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27846721/article/details/88063901

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
负数部分 先取绝对值 然后减一 取余化为二进制 然后全部取反

#include<iostream>
using namespace std;
class Solution {
public:
     int  NumberOf1(int n) {
         char B[32]={'0'};
         int b=1,a,c=0;
         if(n<0)
             b=-1;
         b>0?a=n:a=b*n-1;
         for(int i=31;i>=0;i--){              //化为2进制
             B[i]=a%2+'0';
             if(B[i]=='1')
                 c++;
             a=a/2;
         }
         if(b<0)
             c=32-c;     //取反
         return c;
     }
};

正常思路n&1 n<<左移就行了

展开阅读全文

二进制--负数补码转反码的疑问

09-25

比如我想求-4&-7的值?rn我的推断:rn-4的原码:10000000 00000000 00000000 00000100rn求出补码:rn 反码:11111111 11111111 11111111 11111011rn 补码:11111111 11111111 11111111 11111100rn-7的原码:10000000 00000000 00000000 00000111rn求出补码:rn 反码:11111111 11111111 11111111 11111000rn 补码:11111111 11111111 11111111 11111001rnrn -4补码:11111111 11111111 11111111 11111100rn -7补码:11111111 11111111 11111111 11111001rnrn-4&-7的补码:11111111 11111111 11111111 11111000rn由于符号位是负数,所以要推算出补码的原码进行计算:rn步聚1:根据负数的补码推算出反码rn 11111111 11111111 11111111 11110111rnrn步聚2:推算出原码rn 10000000 00000000 00000000 00001000rnrn最终计算结果:-8rnrn我上面推断出的结果是:是先将补码“11111111 11111111 11111111 11111000”转换成反码,再加1推断出来的,但是网上说有两种方法可以实现:rn1、先减1再转反码rn2、先转反码再加1rn我是用的第2种方法推算出来的,但第一种方法没有理解它的运算原理.rnrn[b]疑问:[/b]rn我在将补码11111111 11111111 11111111 11111000转换成反码的时候,有点疑问,因为负数的反码转成补码是将反码加1,反过来将补码转换成反码是减1,但在低位数减1的时候就成负数了,我就在这一步不知道转换成负数后怎么转换成反码的?请在线的朋友指点一下,谢谢!rnrn 论坛

没有更多推荐了,返回首页