Swift 轮班操作员(>;>;<;)不';不能在按位操作类型上工作?
我想在Swift中制作一个整数幂函数,基于:Swift 轮班操作员(>;>;<;)不';不能在按位操作类型上工作?,swift,generics,bitwise-operators,bit-shift,Swift,Generics,Bitwise Operators,Bit Shift,我想在Swift中制作一个整数幂函数,基于: func**(变量基数:T,变量指数:T)->T{ var结果:T=1 断言(指数>=0,“指数不能为负”) 当指数>0时{ 如果指数&1!=0{ 结果*=基数 } 指数=指数>>1 基数*=基数 } 返回结果 } 我想我可以使用泛型来实现这个函数,这样它就可以处理任何整数类型 不幸的是,我在尝试使用指数>>1时出错: 二进制运算符“>>”不能应用于两个“T”操作数 检查>的函数定义,我发现十种整数类型中的每一种都有一种,但没有定义其他类型。因此,
func**(变量基数:T,变量指数:T)->T{
var结果:T=1
断言(指数>=0,“指数不能为负”)
当指数>0时{
如果指数&1!=0{
结果*=基数
}
指数=指数>>1
基数*=基数
}
返回结果
}
我想我可以使用泛型来实现这个函数,这样它就可以处理任何整数类型
不幸的是,我在尝试使用指数>>1
时出错:
二进制运算符“>>”不能应用于两个“T”操作数
检查>
的函数定义,我发现十种整数类型中的每一种都有一种,但没有定义其他类型。因此,我很惊讶所有其他操作符都在工作,比如&
,但我注意到&
实际上被定义为在所有符合位操作类型的类型上工作,IntegerType
似乎符合
有什么原因使得>
和不能指数/=2
做同样的事情吗?我认为你是正确的(而且似乎有效!)不过,我还是想知道为什么移位运算符不能使用它。这里讨论:。@MartinR谢谢,这几乎包含了我想知道的一切!最有可能的是,这是两年前提出的。我认为这个问题已经解决了。
func **<T : IntegerType>(var base: T, var exponent: T) -> T {
var result: T = 1
assert(exponent >= 0, "Exponent cannot be negative")
while exponent > 0 {
if exponent & 1 != 0 {
result *= base
}
exponent = exponent >> 1
base *= base
}
return result
}