Swift 2 NOT按位运算不会按预期运行

时间:2015-09-02 01:24:42

标签: ios swift swift2 bitwise-operators swift-playground

我试图使用按位NOT运算符~

翻转Swift中数字的所有位
func binary(int: Int) -> String {
    return String(int, radix: 2)
}

let num = 0b11110000
binary(num) //prints "11110000"

let notNum = ~num
binary(notNum) //prints "-11110001"

据我了解,notNum应该打印00001111docs),而是打印-11110001。这是怎么回事?

2 个答案:

答案 0 :(得分:4)

这不是按位运算符的问题,而是String初始化程序的行为问题。 init(_:radix:uppercase:)

中有2个String初始值设定项
public init<T : _SignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)
public init<T : UnsignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)

要获得预期结果,您必须使用UnsignedIntegerType一个:

let num:UInt = 0b11110000
let notNum = ~num

String(notNum, radix: 2)
// -> "1111111111111111111111111111111111111111111111111111111100001111"

OR:

let num = 0b11110000
let notNum = ~num

String(UInt(bitPattern: notNum), radix: 2)
// -> "1111111111111111111111111111111111111111111111111111111100001111"

答案 1 :(得分:3)

那是因为你使用的是Int而不是UInt8:

试试这样:

func binary(uint8: UInt8) -> String {
    return String(uint8, radix: 2)
}

let num:UInt8 = 0b11110000
binary(num) //prints "11110000"

let notNum = ~num
binary(notNum) //prints "1111"