我如何检查一个位值是否等于1

本文关键字:是否 一个 何检查 检查 | 更新日期: 2023-09-27 18:10:37

我有一个运行的OpenCL内核。如何检查变量中选定位置的位是否等于1 ?

例如,我发现在c#中,我们可以使用如下代码将uint转换为包含位的字符串:

// Here we will store our bit
string bit;
// Unsigned integer that will be converted
uint hex = 0xfffffffe;
// Perform conversion and store our string containing bits
string str = uint2bits(hex);
// Print all bits "11111111111111111111111111111110"
Console.WriteLine(str);
// Now get latest bit from string
bit = str.Substring(31, 1);
// And print it to console
Console.WriteLine(bit);
// This function converts uint to string containing bits
public static string uint2bits(uint x) {
    char[] bits = new char[64];
    int i = 0;
    while (x != 0) {
        bits[i++] = (x & 1) == 1 ? '1' : '0';
        x >>= 1;
    }
    Array.Reverse(bits, 0, i);
    return new string(bits);
}

如何使内核内部像上面的代码?

__kernel void hello(global read_only uint* param) {
/*
Do something with "param"
...
*/
int bit;
int index = 31;
/*
Store bit value ("0" or "1") at variable "bit"
...
*/
if (bit == 1) {
// ...
} else {
// ...
}
// Or maybe something more easy to check a bit value at "index" in "param" ... ?
}

我在哪里可以读到更多关于这个的信息?

我如何检查一个位值是否等于1

您可以通过屏蔽1<<b来检查数字中的位b是否被设置为1或0,并将结果与零进行比较:

static bool isBitSet(uint n, uint b) {
    return (n & (1U << b)) != 0;
}

二进制1 << b的值由b(从0开始倒数第6位)上的单个1和其他所有位置的0组成。当您使用按位与运算符&将此掩码应用于n时,您将获得数字n的单个位,并且所有其他位置都为零。因此,当nb位置零时,整体运算结果为零,否则为非零。

相关文章: