如何检查某个位的值是否等于 1?

Kec*_*hup 1 c# bit opencl

我有一个正在运行的 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);
}
Run Code Online (Sandbox Code Playgroud)

如何像上面的代码那样制作内部内核?

__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" ... ?

}
Run Code Online (Sandbox Code Playgroud)

我可以在哪里阅读更多相关内容?

das*_*ght 5

您可以通过使用 进行掩码并将结果与​​零进行比较来检查数字中的某个位是否b设置为 1 或 0 :1<<b

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

二进制中的值由从后开始计数的第一个位置(从零开始)和所有其他位置的零1 << b组成。当您使用按位 AND 运算符应用此掩码时,您将获得一位 number ,并且所有其他位置均为零。因此,当第-位设置为零时,整个操作的结果为零,否则为非零。1bn&nbn