These are the definitions of the right shift operators

        public func >>(lhs: Int8, rhs: Int8) -> Int8

        public func >>(lhs: Int, rhs: Int) -> Int

        public func >>(lhs: UInt, rhs: UInt) -> UInt

        public func >>(lhs: Int64, rhs: Int64) -> Int64

        public func >>(lhs: UInt64, rhs: UInt64) -> UInt64

        public func >>(lhs: UInt8, rhs: UInt8) -> UInt8

        public func >>(lhs: UInt16, rhs: UInt16) -> UInt16

        public func >>(lhs: Int16, rhs: Int16) -> Int16

        public func >>(lhs: Int32, rhs: Int32) -> Int32

        public func >>(lhs: UInt32, rhs: UInt32) -> UInt32


Note that both left and right hand side are of the same type. In my opinion, 
rhs, which represents the number of bits to shift, should always be an Int e.g.

        public func >>(lhs: UInt64, rhs: Int) -> UInt64

The two operands are fundamentally different, the left hand one is conceptually 
an array of bits and the right hand one is conceptually a count. 

The current definitions mean that I almost always have to do a cast on the 
right operand with shift operations. e.g. the following snippet that converts a 
UInt64 into an array of boolean values.

    let aNumber: UInt64 = 0x123456
    var numberAsBits: [Bool] = [];
    for i in 0 ..< 64
    {
        numberAsBits.append((aNumber >> i) & 1 != 0); // Error because i needs 
to be cast to a UInt64
    }

I would like additional versions of the shift operator where rhs is an Int 
please.

Needless to say, the same applies to the left shift operators.

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to