首页 > 解决方案 > (x % y) 和 (x & (y-1)) 是否等效?

问题描述

我认为计算 x % y 相当于 x & (y-1),但是当我尝试

if (x % y == x & (y-1)) {
    ...
}

除非(int)(x & (y-1))改用,否则我总是会出错。
这可能是因为“按位与”的返回类型。但是在谷歌搜索后,我没有找到很多关于你获得什么类型的数据的信息&
谁能帮忙解释一下?

编辑:x 和 y 都是整数类型,y 是 2 的幂。

标签: cbitwise-operators

解决方案


结果的类型由通常的算术规则确定(+例如,与 for 相同),但这不是您的问题。

你可能想看看这里

7   == !=   For relational = and ≠ respectively
8   &   Bitwise AND

因此(x & (y - 1)),即使没有类型转换,放入括号就足够了。

y但请注意,您的比较结果仅在2 的幂时才成立。

y在你的测试中是 2 的幂吗?然后,由于运算符优先级,您的编译器将该语句视为带有额外括号的语句-</p>

if(((x % y) == x) & (y - 1)) {

通过类型转换,你得到了正确的表达

if((x % y) == (x & (y - 1))) {

这是真的,如果y二进制是单个 1 后跟几个 0。


推荐阅读