在 C++ 中,我经常使用这个模板化函数...
template<typename T>
bool isPowerOf2 (T x) // returns nonzero if x is a power-of-2
{
return x && ((x & (~x + 1)) == x);
}
...我正尝试在 C# 中实现相同的功能。所以这是我能想到的最好的:
public class Utils
{
// ...
public static bool isPowerOf2<T>(T x) // returns true if x is a power-of-2
{
return (x != 0) && ((x & (~x + 1)) == x);
}
}
但 Visual Studio 提示 error CS0019: Operator '!=' cannot be applied to operands of type 'T' and 'int'
和 error CS0023: Operator '~' cannot be应用于“T”类型的操作数
。
如果我删除通用的东西 & 只是让它成为“public static bool isPowerOf2(int x)
”,它工作正常(就像在 various implementations here 中一样),但我想要实现是通用的,因此它适用于任何整数类型。
这很好地说明了为什么 C# 泛型不是 C++ 模板。 C# 必须能够在不知道 T
的情况下编译代码,而 C++ 可以推迟编译直到知道 T
的类型。这让 C++ 知道如何执行 ~
、+
、&
等。
使用 C# 的最简单方法是为您计划与函数一起使用的类型进行多次重载。这会导致少量代码重复,但它比其他选项(例如使用 LINQ 表达式动态生成代码)更易读。
如果性能不是很重要,您还可以使用 Convert.ToInt64
:
bool isPowerOf2 (object obj) {
var x = Convert.ToInt64(obj);
return x && ((x & (~x + 1)) == x);
}
我是一名优秀的程序员,十分优秀!