整数转换为二进制 |
您所在的位置:网站首页 › 2050转二进制 › 整数转换为二进制 |
刷 二进制中1的个数 时,遇到该基础问题,故整理一下。 感谢参考链接:https://jingyan.baidu.com/article/84b4f565cf33fe60f6da321b.html 1、正整数转二进制除2之后将余数倒序排列, 直到商小于1 201 / 2 = 100······1 100 / 2 = 50 ······0 50 / 2 = 25 ······0 25 / 2 = 12 ······1 12 / 2 = 6 ······0 6 / 2 = 3 ······0 3 / 2 = 1 ······1 1 / 2 = 0 ······1 (商小于1,结束计算并将余数倒序排列) 得到:201(十进制) = 11001001(二进制) 2、负整数转二进制1)得到取绝对值的整数的二进制。 如 -201,先得到201的二进制11001001 2)取反。得00110110 3)加1。 得00110111 3、小数部分转二进制1)小数部分乘2后将整数部分顺序排列。 如0.125,整数部分顺序排列得001 2)前面加0. 得0.001 回到前面所说的二进制中1的个数。 由于计算机存储数据用的是补码。首位是符号位。 为什么这么存储呢?参考 https://www.cnblogs.com/spring-hailong/p/6071245.html 所以就会出现对负数右移(eg: n = n>>1),因为最高位补1,一直循环的情况。 参考 https://www.cnblogs.com/kaituorensheng/p/3642116.html 所以才会有人在右移前要判断是否为负,负数通过 n & 0x7FFFFFFF 将符号位改为0。 得到题解: class Solution { public: int NumberOf1(int n) { int count = 0; if(n < 0){ n = n & 0x7FFFFFFF; ++count; } while(n != 0){ count += n & 1; n = n >> 1; } return count; } };当然也可以用 n= n>>>1,无视符号位右移,避免判断。 但一山更比一山高,有更聪明的人提出左移不就好了。 计算机中二进制左移末尾补0,最后会出现0的情况,这样就不会有上述死循环的问题了,便得到题解 private static int NumberOf1_low(int n) { int count = 0; int flag = 1; while (flag != 0) { if ((n & flag) != 0) { count++; } flag = flag |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |