如何在C中找到32位int中最左边的1

seb*_*ebi 4 c bitmask bitwise-operators

可能重复:
找到C中的最高位

我怎么能写一个C函数,将产生一个面具表示最左边的1x.

例如:0xFF00 -> 0x80000x6600 -> 0x4000.至今:

int left1(unsigned x){}
Run Code Online (Sandbox Code Playgroud)

我明白了,0xFF00 == 1111 1111 0000 0000..0x6600 == 0110 0110 0000 0000..但我以后难住了.

caf*_*caf 15

您可以分两部分来完成:首先,使用一种称为"位拖尾"的技术,以确保第一个1右侧的所有位也是1:

x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
x |= x >> 1;
Run Code Online (Sandbox Code Playgroud)

此时,输入0xFF00x等于0xFFFF,输入0x6600x等于0x7FFF.然后,我们可以1使用以下最高设置:

x ^= x >> 1;
Run Code Online (Sandbox Code Playgroud)

  • @ don4of4:该问题指定`unsigned`作为输入数字的类型. (4认同)

pha*_*ers 3

计算向右位移直到达到 1 所需的次数,然后将 1 向左位移相同的次数。

int ct=0;
while (x > 1) { ct++; x = x >> 1; }
x = x << ct;
Run Code Online (Sandbox Code Playgroud)