如何解决编写使用按位运算符、相等检查和布尔运算符的表达式,以在 O(1) 时间内完成以下操作
• 右传播 x 中最右边的设置位,例如,将 (01010000) 变为 (01011111)。
我被这个问题困住了。我可以用 x &= ~(x-1)
屏蔽掉最右边的位,如何按照问题状态设置它后面的位?
我的尝试:
int problemOne(int n)
{
int k = n;
k &= ~(n-1);
n |= k;
return n;
}
解决方法
实际上,您比您想象的更接近,您已经拥有所需的所有部件。 n-1
会将所有位设置在最右边的设置位的右侧,这只是因为二进制加法/减法的工作原理。您不需要否定这一点,因为您现在已经设置了所需的位。您实际上只需要将这个 OR 原始输入组合起来,将您新设置的位与 n
中的现有设置位组合起来。换句话说,这可以是一个单行:return (n | (n-1))
.
另一个快速提示,有时在 Python REPL 中解决一些逻辑问题会很有用,以避免在 C 等低级语言中对逻辑进行故障排除的耗时周期。例如,在 Python 3 shell 中我花了一些时间来确认这是否按照我的想法工作:f'{((x-1) | x):b}'
为您的示例输入打印正确的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。