在Swift中,左移(<<)实际上是什么意思?

20

我正在玩一个类似Flappy Bird的克隆游戏,但是我无法理解下面代码的含义

let birdCategory: UInt32 = 1 << 0
let worldCategory: UInt32 = 1 << 1
let pipeCategory: UInt32 = 1 << 2
let scoreCategory: UInt32 = 1 << 3

如果这个问题很明显,我很抱歉。我已经试着寻找答案,但没有找到。谢谢。


1
“<<” 在官方 Swift 文档的 高级运算符 中有详细描述(附有插图)。 - Martin R
移位操作不是 Swift 的特性,它只是简单地将位向左或向右移动,所有编程语言都实现了这个功能。有不同类型的移位,有些会旋转,有些则不会,还有一些会带进位等等。我建议您深入了解位运算和二进制数系统。 - Mostafa Berg
2个回答

54

那就是按位左移运算符

基本上它是这么做的

// moves 0 bits to left for 00000001
let birdCategory: UInt32 = 1 << 0 

// moves 1 bits to left for 00000001 then you have 00000010 
let worldCategory: UInt32 = 1 << 1

// moves 2 bits to left for 00000001 then you have 00000100 
let pipeCategory: UInt32 = 1 << 2

// moves 3 bits to left for 00000001 then you have 00001000 
let scoreCategory: UInt32 = 1 << 3
你最终会拥有什么。
birdCategory = 1
worldCategory = 2
pipeCategory = 4
scoreCategory= 8

抱歉再次提出一个旧答案,不过想知道这样做的逻辑原因是什么,而不是0、1、2、3? - user1898712

3
首先,你发布的是Swift代码,而不是Objective-C。
但我认为这就像在普通的C语言中一样是一个字节移位。 a << x等同于a * 2^x。通过将位向左移动一位,您可以使值加倍。这样做x次将产生2^x倍的值,当然,除非溢出。
关于计算机如何表示数字,您可以在这里阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接