关于THE C PROGRAMMING LANGUAGE 这本书上的一个问题

yuanyangzhou 2003-01-03 06:22:37
在求反码时候,表达式X&=(X-1)用于把X最右边的值为1的位删除掉,请解释这样做的道理,

各位看过这本书时是怎么考虑的,恳请赐教,多谢!
...全文
19 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
solotony 2003-01-03
  • 打赏
  • 举报
回复
switch(X%4)
case 0:
X&0x3 == 0x0
(X-1)&0x3 == 0x3
X&(X-1) == 0x0
break;
case 1:
X&0x3 == 0x1
(X-1)&0x3 == 0x0
X&(X-1) == 0x0
break;
case 2:
X&0x3 == 0x10
(X-1)&0x3 == 0x01
X&(X-1) == 0x00
break;
case 3:
X&0x3 == 0x11
(X-1)&0x3 == 0x10
X&(X-1) == 0x10
break;

以此类推
当X最右位为1时, X-1最右位为0, 相与后为0,
当X最右位为0时, X-1最右位为1, 并且在X的最右边的一个1变为0(借位)
相与后最右位与最右边一个1都变成0.

chinajiji 2003-01-03
  • 打赏
  • 举报
回复
10少了,不做!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧