Оператор Swift NOT (~) печатает значения, отличные от используемых - PullRequest
0 голосов
/ 29 мая 2020

Оператор Swift побитовое НЕ (~) инвертирует все биты в числе.

В документации приведен пример:

let initialBits: UInt8 = 0b00001111
let invertedBits = ~initialBits  // equals 11110000

И я могу подтвердить это, напечатав String:

print(String(invertedBits, radix: 2)) // equals 11110000

Учитывая это logi c, я ожидал бы ~0 to equal 1 и ~1 to equal 0. Однако при печати их, как я делал выше, печатается что-то неожиданное:

 print(String(~0b1, radix: 2)) // equals -10
 print(String(~0b0, radix: 2)) // equals -1

При использовании я вижу что-то другое:

print(String(0b100 & ~0b111, radix: 2)) // equals 0 just as I would expect 100 & 000  to equal 000

но

print(String(~0b111, radix: 2)) // equals -1000

~0b111 похоже, действует как 0b000, но печатается как -1000

Что здесь происходит?

1 Ответ

0 голосов
/ 29 мая 2020

В примере, приведенном в документации, initialBits имеет явный тип. Что происходит, можно показать по следующему коду

let number = 0b1 // we don't specify a type, therefore it's inferred

print(type(of: number))           // Int
print(String(~number, radix: 2))  // -10 as you know

print(number.bitWidth)            // 64 because integers have 64 bits

// now if we create a 64 bit number, we can see what happened
// prints -10 because this number is equivalent to the initial number
print(String(~0b0000000000000000000000000000000000000000000000000000000000000001, radix: 2))
...