(x%y)和(x&(y-1))是否相等?

时间:2018-05-28 18:22:18

标签: c bitwise-operators

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

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

除非使用(int)(x & (y-1)),否则我总是假的 这可能是因为“按位和”的返回类型。但是在谷歌搜索之后,我没有找到关于&后获得的数据类型的更多信息 任何人都可以帮忙解释一下吗?

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

2 个答案:

答案 0 :(得分:3)

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

您可能想查看here

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

即使没有类型转换,将(x & (y - 1))放在括号中也足够了。

但请注意,只有当y为2的幂时,您的比较结果才会生效。

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

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

通过类型转换,您获得了正确的表达式

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

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

答案 1 :(得分:1)

表达式的结果类型在这里无关紧要。两个操作数都被扩展为intunsigned int,或者如果任一操作数的排名高于int,则提升为更宽操作数的等级。这些都不会改变结果。

但是,这是一个优先问题。 &具有反直觉较低优先级而不是==,因为最初用作boolean logic operator within if statements&优先从那时起就令人遗憾地保持不变。

因此,您的表达式读起来好像是写的

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

因为您可能正在使用y< x,然后x % y不能等于x,因此左侧评估为0,并且任何值的按位结果将始终结果在0,因此是假的。

如果您正确填充,

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

如果y是2的正幂,则等价将适用于所有非负x。(1,2,4,8,16 ......)