2015-09-02 34 views
0

我試圖使用位翻轉所有斯威夫特數字的位數不得操作~斯威夫特2 NOT位運算的行爲不

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。這裏發生了什麼?

回答

4

這不是位運算符的問題,但String初始化的行爲的問題。 有2 init(_:radix:uppercase:)初始化在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" 
3

那是因爲你正在使用的不是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" 
+0

謝謝,我看到的作品。不過,我仍然不明白爲什麼它不適用於有符號整數。無論整數如何存儲,否定否定操作符都不應該工作? – Kevin