解决方法
假设2的补码(或者我是无符号的),-i等于〜i 1.
我& (〜i 1)是提取i的最低位的技巧.
它的作用是因为1实际做的是设置最低的清除位,并清除比所有位低的位.所以在i和〜i 1中设置的唯一位是从i(即〜i中的最低清除位)的最低位.在〜i 1中,低于该位的位是清楚的,并且高于i的位在i和〜i之间是不相等的.
在循环中使用它似乎是奇怪的,除非循环体修改i,因为i = i& (-i)是一个幂等的操作:再次执行两次相同的结果.
[编辑:在其他地方的评论中你指出,代码实际上是i = i& (-一世).那么对于非零我做的是清除i的最低位的集合,并将下一个清除位设置为101100 – > 110000.对于没有比最低设置位(包括i = 0)更高的位的i,将i设置为0.因此,如果不是因为我从0开始的事实,每个循环将至少增加i有时更多的是上一个循环的两倍,直到最终超过n并且断开或变为0并永久循环.
原文地址:https://www.jb51.cc/c/114033.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。