二进制中1的个数(十一)
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
function NumberOf1(n){ //当输入的为一个负数时 //-123的二进制表示为-1111011 123的二进制表示为1111011 123的后面部分的补码0000101=122的正码 1111011按位取反 //所以一个负数的二进制为 它的正数的二进制的负数 这个正数后面的补码 就等于 (这个正数-1)的正码按位取反 if(n<0){ n=-n;//将负数变为正数 n=n-1;//再将这个正数-1 因为这个正数减一取反 即为这个正数的补码 然后将这个正数的补码全部按位取反即得-123的补码表示 //因为一个负数的二进制是它的正数的二进制取反 //所以可以将这个负数变为正数 然后再-1 得到的二进制,就是正数的补码 然后将这个正数的补码全部按位取反即得-123的补码表示 var str=(Array(32).join('0')+n.toString(2)).slice(-32); str=exchange(str); }else{ var str=(Array(32).join('0')+n.toString(2)).slice(-32); } return cal(str); } /** * 计算1的个数 */ function cal(str){ var count=0; for(var i=0;i<str.length;i++){ if(str[i]==1){ count++; } } return count; } //如果是负数,0变1,1变0 function exchange(str){ var arr=str.split(''); for(var i=0;i<arr.length;i++){ if(arr[i]==0){ arr[i]=1; }else{ arr[i]=0; } } str=arr.join(''); return str; }