C中按位的反转操作
Invert operation for bitwise in C
亲爱的所有 C 程序员:
X = 1 << N; (left shift)
如何从 X 中恢复 N?
谢谢
在一个while循环中,一直右移直到X==1,记录你要右移多少次,计数器会给出N。
int var = X;
int count = 0;
while (var != 1){
var >>= 1;
count++;
}
printf("N is %d", count);
试试这个(flsl from here 可从 string.h on macOS 获得):
int flsl(long mask)
{
int bit;
if (mask == 0) return (0);
for (bit = 1; mask != 1; bit++)
mask = (unsigned long)mask >> 1;
return (bit);
}
unsigned char binlog(long mask) { return mask ? flsl(mask) - 1 : 0; }
int x = 1 << 20;
printf("%d\n", binlog(x)); ===> 20
N
在这种情况下是您在 1
处移动的位位置。假设 X
这里只设置了一位。然后要找出该位位置对应的数字,您必须使用按位 AND:
遍历数据和掩码
for(size_t i=0; i<sizeof(X)*8; i++)
if(X & (1<<i))
printf("%d", i);
如果性能很重要,那么您可以使用所有可能的结果进行查找 table。
亲爱的所有 C 程序员:
X = 1 << N; (left shift)
如何从 X 中恢复 N?
谢谢
在一个while循环中,一直右移直到X==1,记录你要右移多少次,计数器会给出N。
int var = X;
int count = 0;
while (var != 1){
var >>= 1;
count++;
}
printf("N is %d", count);
试试这个(flsl from here 可从 string.h on macOS 获得):
int flsl(long mask)
{
int bit;
if (mask == 0) return (0);
for (bit = 1; mask != 1; bit++)
mask = (unsigned long)mask >> 1;
return (bit);
}
unsigned char binlog(long mask) { return mask ? flsl(mask) - 1 : 0; }
int x = 1 << 20;
printf("%d\n", binlog(x)); ===> 20
N
在这种情况下是您在 1
处移动的位位置。假设 X
这里只设置了一位。然后要找出该位位置对应的数字,您必须使用按位 AND:
for(size_t i=0; i<sizeof(X)*8; i++)
if(X & (1<<i))
printf("%d", i);
如果性能很重要,那么您可以使用所有可能的结果进行查找 table。