c# - 如何检查位值是否等于 1?

标签 c# opencl bit

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

例如,我发现在 C# 中我们可以使用代码 like thisuint 转换为包含位的字符串:

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

}

我在哪里可以阅读更多相关信息?

最佳答案

你可以检查一下 b通过使用 1<<b 屏蔽将数字中的值设置为 1 或 0 ,并将结果与​​零进行比较:

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

1 << b 的值在二进制中由单个 1 组成在b -th 位置从零开始从后面计数,所有其他位置都为零。当您将此掩码应用于 n 时使用按位与运算符 &你得到一个数字 n , 以及所有其他位置的零。因此,当b时,整体运行的结果为零-n 的第一位设置为零,否则设置为非零。

关于c# - 如何检查位值是否等于 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297880/

相关文章:

c# - 在 GridView 中显示一对多关系中的单个值

c# - SQL 查询通知在横向扩展设置中并不总是有效 (SQL Server)

C#:将桌面墙纸设置为纯色

clang - 使用 Clang 将 OpenCL 编译为 PTX 时 Unresolved external 问题?

c - 如何将主机指针传递到映射设备内存而不复制主机数据?

java - 负数会消耗更多内存吗?

algorithm - 对 40 亿个整数使用 10 MB 的内存(关于找到优化的 block 大小)

c# - String.Trim() 删除的所有字符的列表?

opencl - 在 OpenCL 中使用多个程序

c++ - 合并位,然后判断结果有多少个0