整数转换为二进制

您所在的位置:网站首页 2050转二进制 整数转换为二进制

整数转换为二进制

2023-12-17 17:19| 来源: 网络整理| 查看: 265

刷  二进制中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