Ios swift中的负数模
在swift中负数模是如何工作的? 当我这样做(-1%3)时,它给出的是-1,但剩余的是2。它的优点是什么?来自: 余数运算符 余数运算符(Ios swift中的负数模,ios,swift,Ios,Swift,在swift中负数模是如何工作的? 当我这样做(-1%3)时,它给出的是-1,但剩余的是2。它的优点是什么?来自: 余数运算符 余数运算符(a%b)计算出b 将装入a并返回剩余的值(称为 其余部分) 余数运算符(%)在中也称为模运算符 其他语言。然而,它在Swift中的行为是负数 这意味着严格来说,它是一个余数,而不是一个模 操作 当计算一个项目的余数时,应用相同的方法 a的负值: -9 % 4 // equals -1 将-9和4插入方程中,得到: -9 = (4 x -2) + -1
a%b
)计算出b
将装入a
并返回剩余的值(称为
其余部分)
余数运算符(%
)在中也称为模运算符
其他语言。然而,它在Swift中的行为是负数
这意味着严格来说,它是一个余数,而不是一个模
操作
当计算一个项目的余数时,应用相同的方法
a的负值:
-9 % 4 // equals -1
将-9
和4
插入方程中,得到:
-9 = (4 x -2) + -1
给出余数值-1
在您的情况下,没有任何3
适合1
,剩余部分是1
(与-1
->相同,剩余部分是-1
)。来自:
余数运算符
余数运算符(a%b
)计算出b
将装入a
并返回剩余的值(称为
其余部分)
余数运算符(%
)在中也称为模运算符
其他语言。然而,它在Swift中的行为是负数
这意味着严格来说,它是一个余数,而不是一个模
操作
当计算一个项目的余数时,应用相同的方法
a的负值:
-9 % 4 // equals -1
将-9
和4
插入方程中,得到:
-9 = (4 x -2) + -1
给出余数值-1
在您的情况下,没有3
适合1
,余数是1
(与-1
->余数是-1
)。快速余数操作符%
计算
整数除法:
a % b = a - (a/b) * b
其中/
是截断整数除法。就你而言
(-1) % 3 = (-1) - ((-1)/3) * 3 = (-1) - 0 * 3 = -1
因此余数总是与股息符号相同(除非
余数为零)
这与C99标准中要求的定义相同,
例如,见
. 另见
有关概述
这是如何在不同的编程语言中处理的
Swift中的“真”模函数可定义如下:
func mod(_ a: Int, _ n: Int) -> Int {
precondition(n > 0, "modulus must be positive")
let r = a % n
return r >= 0 ? r : r + n
}
print(mod(-1, 3)) // 2
Swift余数运算符%
计算
整数除法:
a % b = a - (a/b) * b
其中/
是截断整数除法。就你而言
(-1) % 3 = (-1) - ((-1)/3) * 3 = (-1) - 0 * 3 = -1
因此余数总是与股息符号相同(除非
余数为零)
这与C99标准中要求的定义相同,
例如,见
. 另见
有关概述
这是如何在不同的编程语言中处理的
Swift中的“真”模函数可定义如下:
func mod(_ a: Int, _ n: Int) -> Int {
precondition(n > 0, "modulus must be positive")
let r = a % n
return r >= 0 ? r : r + n
}
print(mod(-1, 3)) // 2
如果您真正想要的是捕获一个介于0和b之间的数字,请尝试使用以下方法:
infix operator %%
extension Int {
static func %% (_ left: Int, _ right: Int) -> Int {
if left >= 0 { return left % right }
if left >= -right { return (left+right) }
return ((left % right)+right)%right
}
}
print(-1 %% 3) //prints 2
这将适用于a的所有值,与前面的答案不同,而仅当a>-b时才有效
我更喜欢%%运算符而不是重载%,因为很明显,您没有使用真正的mod函数
使用if语句而不仅仅是使用最终返回行的原因是为了速度,因为mod函数需要除法,除法比条件除法更昂贵。如果您真正想要的是捕获0和b之间的数字,请尝试使用以下方法:
infix operator %%
extension Int {
static func %% (_ left: Int, _ right: Int) -> Int {
if left >= 0 { return left % right }
if left >= -right { return (left+right) }
return ((left % right)+right)%right
}
}
print(-1 %% 3) //prints 2
这将适用于a的所有值,与前面的答案不同,而仅当a>-b时才有效
我更喜欢%%运算符而不是重载%,因为很明显,您没有使用真正的mod函数
使用if语句而不仅仅是使用最终返回行的原因是为了速度,因为mod函数需要除法,除法的成本比条件除法更高。受CDEINCK启发的答案是为了简单而牺牲速度:
infix operator %%
extension Int {
static func %% (_ left: Int, _ right: Int) -> Int {
let mod = left % right
return mod >= 0 ? mod : mod + right
}
}
我在操场上用这个小回路测试了它:
for test in [6, 5, 4, 0, -1, -2, -100, -101] {
print(test, "%% 5", test %% 5)
}
CDENCK以牺牲速度换取简单,其灵感来源如下:
infix operator %%
extension Int {
static func %% (_ left: Int, _ right: Int) -> Int {
let mod = left % right
return mod >= 0 ? mod : mod + right
}
}
我在操场上用这个小回路测试了它:
for test in [6, 5, 4, 0, -1, -2, -100, -101] {
print(test, "%% 5", test %% 5)
}
文档当然可以改进。“符合
-9
”的4
的最大倍数不是很清楚…@MartinR同意:)文档肯定可以改进。“符合-9
”的4
的最大倍数不是很清楚…@MartinR同意:)这里有关于它的讨论,还有其他解决方案:。Martin R的答案与我的答案是相同的算法,但他使用泛型使其更有用。这里有关于它的讨论,以及其他解决方案:。Martin R的答案与我的算法相同,但他使用泛型使其更有用。