Swift中变量位的移位行为

D.i*_*con 2 language-design bit-shift swift

当我试图在我的RGB颜色实验上移位时,我注意到我无法移动可变数量的位.

Swift书只说你向左/右移动"一个数字"

"按位左移运算符(<<)和按位右移运算符(>>)根据下面定义的规则,将一个数字中的所有位向左或向右移动一定数量的位置."

是故意只能移动预定义数量的位吗?

// Works fine:
let shiftMe: UInt32 = 0xFF0000
let shiftedConst = shiftMe >> 16

// Doesn't work: 
let shiftMe: UInt32 = 0xFF0000
let shiftValue:Int = 16
let shiftedConst = shiftMe >> shiftValue
Run Code Online (Sandbox Code Playgroud)

第二个示例将不会编译并抛出此错误:

无法找到接受所提供参数的">>"的重载

快速设计是这样的吗?它是一个bug并修复beta3?(我还在beta2 atm.)

zap*_*aph 5

移位计数的类型必须与要移位的值的类型相匹配.

shiftValue必须申报UInt32.

let shiftMe: UInt32 = 0xFF0000
let shiftValue:UInt32 = 16
let shiftedConst = shiftMe >> shiftValue
Run Code Online (Sandbox Code Playgroud)

如果移位计数类型是UInt8,UInt16,uInt32或uInt64(甚至是签名版本),IMO它应该没有任何区别,因为移位范围小于任何这些类型.此外,这是一个既不记录也不直观的不必要的绊脚石.

错误消息无益且不正确:

错误:: 39:20:错误:'UInt32'无法转换为'UInt8'
让shiftConst = shiftMe >> shiftValue

  • @holex这应该向Apple报告,这是Beta软件的重点,以获得大量测试人员遇到的问题.它使得编写代码更加困难,并且错误消息不正确且无用. (2认同)