如何检查位值是否等于 1?
How can I check if a bit value is equal to 1?
我有一个 运行 OpenCL 内核。如何检查变量中选定位置的位是否等于 1?
例如,我发现在 C# 中我们可以使用代码 like this:
将 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<<b
屏蔽并将结果与零进行比较来检查数字中的位 b
是否设置为 1 或 0:
static bool isBitSet(uint n, uint b) {
return (n & (1U << b)) != 0;
}
二进制中 1 << b
的值由单个 1
组成,第 b
个位置从零开始计数,其他所有位置均为零。当您使用按位 AND 运算符 &
将此掩码应用于 n
时,您会得到数字 n
的一位,而所有其他位置都为零。因此,当 n
的第 b
位设置为零时,整个操作的结果为零,否则为非零。
我有一个 运行 OpenCL 内核。如何检查变量中选定位置的位是否等于 1?
例如,我发现在 C# 中我们可以使用代码 like this:
将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<<b
屏蔽并将结果与零进行比较来检查数字中的位 b
是否设置为 1 或 0:
static bool isBitSet(uint n, uint b) {
return (n & (1U << b)) != 0;
}
二进制中 1 << b
的值由单个 1
组成,第 b
个位置从零开始计数,其他所有位置均为零。当您使用按位 AND 运算符 &
将此掩码应用于 n
时,您会得到数字 n
的一位,而所有其他位置都为零。因此,当 n
的第 b
位设置为零时,整个操作的结果为零,否则为非零。