九度oj1513

来源:互联网 发布:淘宝助理水印图片大小 编辑:程序博客网 时间:2024/06/15 05:16
题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。

输出:

对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。

这道题拿过来第一想法就是按照手动算法一步一步来,可是写到后来觉得很麻烦,然后想到可以利用位运算,这道题就解决啦。这里有几点要注意:

1. 对于int ,左移补0,右移补符号位。

2. 想要得到数的每一位,有下面几种写法

int j=0;while(x){a[j++]=x&1;x>>=1;}
这种方法有两个问题,首先你得到的是反序,需要有对调的过程,当然这不是最重要的,如果是正数,可以正常结束,没有问题,如果是负数,右移补1,则会死循环。

或者

int j=0;for(i=0;i<32;i++){a[j++]=x&1;x>>=1;}
这个解决 了死循环,但是还是要反序,当然以上两种办法都改变了x这个数本身。

比较好的是这种方法

for(i=31;i>=0;i--){if(x&(1<<i))cout<<"1";else cout<<"0";}
x没动,只是左移1,而且不用反序,比较好的解决了三个问题。




0 0
原创粉丝点击