Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift中的负数模_Ios_Swift - Fatal编程技术网

Ios swift中的负数模

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

在swift中负数模是如何工作的? 当我这样做(-1%3)时,它给出的是-1,但剩余的是2。它的优点是什么?

来自:

余数运算符 余数运算符(
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的答案与我的算法相同,但他使用泛型使其更有用。