bit演算子とジェネリックス
整数型のビットの並びを表示するジェネリックス関数を作成したいと思っています。
最初に、UInt8型のみ対応を作成してみました。
ここで、1つの疑問があり、型に対するバイト数を知る方法がわかりません。
ネット拾ったコードでサイズを取得するようにしました。
sizeof()って使えますか?
func BitStringUInt8(n:UInt8)->String{
var bitString : String = ""
for i in (0...(MemoryLayout<UInt8>.size)*8-1).reversed() {
if ((n >> UInt8(i)) & 0x1) == 0x1{
bitString += "1"
}else{
bitString += "0"
}
}
return bitString
}
で、これを元にジェネリックスにしてみました。
func BitString<T>(n:T)->String{
var bitString : String = ""
for i in (0...(MemoryLayout<T>.size)*8-1).reversed() {
print(i)
if ((n >> T(i)) & 0x1) == 0x1{
bitString += "1"
}else{
bitString += "0"
}
}
return bitString
}
if ((n >> T(i)) & 0x1) == 0x1{のT(i)でコンパイルエラーとなります。
型条件としてBitwiseOperationsとしてみたのですが、エラーが取れません。
教えてください。イニシャライズが無いとのエラーです。
また、なぜ、シフト演算子は「型」が同じにしなければならないのに、&演算子は、
「型」を同じにする必要はないのでしょうか?
「0x1」はInt型となるはずなのに。。。