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”操作数 检查>的函数定义,我发现十种整数类型中的每一种都有一种,但没有定义其他类型。因此,

我想在Swift中制作一个整数幂函数,基于:

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
}