微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编写使用按位运算符、相等检查和布尔运算符的表达式,以在 O(1) 时间内完成以下操作

如何解决编写使用按位运算符、相等检查和布尔运算符的表达式,以在 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 举报,一经查实,本站将立刻删除。