c - 在二进制补码中表示 x 所需的最小位数
问题描述
我正在读一本书,其中有一个练习:
/* howManyBits - return the minimum number of bits required to represent x in
* two's complement
* Examples: howManyBits(12) = 5
* howManyBits(0) = 1
* howManyBits(-1) = 1
* howManyBits(0x80000000) = 32
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 90
* Rating: 4
*/
int howManyBits(int x) {
return 0;
}
我什至不明白这个问题本身,为什么 12 需要 5 位,那不是 1100,即 4 位吗?为什么 -1 只需要 1 位?那不是 1...1 在二进制补码中是 -1,所以需要 32 位?
解决方案
为什么
12
需要 5 位,不是1100
4 位吗?
使用二进制补码,需要多 1 位来对值的符号进行分类。这(通常)是位模式的最左边位,也称为“最高有效位”(MSB)。如果这个有符号位是1
负值,如果0
是正值。所以你需要 5 位来表示值12
= 01100
,而不是 4。
为什么
-1
只需要1位?
当您只有 1 位时,该位也用于值的符号,可以表示值0
或-1
; -1
而不是1
因为有符号位设置为1
表示负值。
推荐阅读
- python - 在 mac 上以退出代码 137(被信号 9:SIGKILL 中断)完成的进程
- javascript - 如何升级到 Discord.js V13?
- python - 复制文件引发“FileNotFoundError:[Errno 2] 没有这样的文件或目录”
- lotusscript - LotusScript 计划代理刷新不使用 @DBLookup 处理计算字段
- git - 如何删除名为@的Git远程标签
- cloudflare - 如何删除“/cdn-cgi/l/email-protection”页面?(云闪)
- sql-server - 在 SQL Server 中将相似的字符串分组在一起
- html - 有没有办法在 Azure DevOps wiki 页面的 HTML 表中添加 Markdown 链接?
- python-3.x - 使用查询参数“q”过滤谷歌日历事件列表
- java - 按下后退按钮时禁用 Android 按钮