我们知道例如2的幂的模可以这样表示:
x % 2 inpower n == x & (2 inpower n - 1).
例子:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
一般两个数的无幂呢?
比方说:
x%7 ==?
我们知道例如2的幂的模可以这样表示:
x % 2 inpower n == x & (2 inpower n - 1).
例子:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
一般两个数的无幂呢?
比方说:
x%7 ==?
Answers:
首先,说这实际上是不准确的
x % 2 == x & 1
简单的反例:x = -1
。在许多语言中,包括Java ,-1 % 2 == -1
。也就是说,%
不一定是模的传统数学定义。Java将其称为“余数运算符”。
关于按位优化,在按位算术中只能“轻松”完成两个模的幂。一般来说,基地只有模权力b可以“轻易”地与基地做b数字表示。
例如,对于非负数N
,以10为底N mod 10^k
仅取最低有效k
数字。
-1 = -1 (mod 2)
,不知道你在说什么-你的意思是不一样的IEEE 754余?
(a / b) / b + a % b == a
,对于C型运算符,a和b整数,b非零以及abs(a % b) < abs(b)
具有相同的条件。
(a / b)
* b + a % b == a
。
这仅适用于2的幂(并且通常只有正数的幂),因为它们具有独特的属性,即在二进制表示中只有一位被设置为1。因为没有其他数字类共享此属性,所以不能为大多数模表达式创建按位和表达式。
模数“ 7”,无“%”运算符
int a = x % 7;
int a = (x + x / 7) & 7;
没有&
在二进制中使用按位与()运算符,没有。证明草图:
假设有一个这样的值kx & k == x % (k + 1)
,但k!= 2 ^ n-1。然后,如果x == k,则表达式x & k
似乎“正确运行”,结果为k。现在,考虑x == ki:如果k中有任何“ 0”位,则有一些i大于0,在这些位置ki只能用1位表示。(例如,当减去100(4)时1011(11)必须变为0111(7),在这种情况下,当i = 4时000位变为100。)如果k表达式中的某个位必须从零变为一个代表き,则它无法正确计算x%(k + 1),在这种情况下应为ki,但无法实现按位布尔值,也无法在给定掩码的情况下生成该值。