gpt4 book ai didi

isPowerOf2(T x) 的 C# 泛型函数实现

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:09 27 4
gpt4 key购买 nike

在 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);
}

关于isPowerOf2<T>(T x) 的 C# 泛型函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36145112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com