我认为计算x%y相当于x& (y-1),但是当我尝试
时if (x % y == x & (y-1)) {
...
}
除非使用(int)(x & (y-1))
,否则我总是假的
这可能是因为“按位和”的返回类型。但是在谷歌搜索之后,我没有找到关于&
后获得的数据类型的更多信息
任何人都可以帮忙解释一下吗?
编辑:x和y都是整数类型,y是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)
表达式的结果类型在这里无关紧要。两个操作数都被扩展为int
或unsigned 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 ......)