有人可以向我解释这一行吗? c | = 1 << i;

时间:2019-11-06 21:57:10

标签: c bitwise-operators bit bit-shift

我最近启动了C,由于某些原因,我无法得到这行c | = 1 << i;

我在网上发现此函数的目的是从数组中获取最低有效位,然后将其合并,并作为字节返回。

unsigned char getlsbs(unsigned char* p)
{
        int i;
        unsigned char c = 0;
        for(i = 0; i < 8; i++)
        {
                int a = p[i] & 1;
                if(a)
                {
                        c |= 1 << i;
                }
        }
        return c;
}

c | = 1 << i;与c = c |相同1 <<我;对吗?

有人可以用1和0解释这个例子吗?我认为这将非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

好吧

1<<i 

应为1,后跟i个零(二进制)-所以

1<<0 = 0001
1<<1 = 0010
1<<2 = 0100

将其与C语言中的内容进行“或”运算时,意味着强制设置该位,因此:

if you take 0000 | 0010 you'll get 0010

c val| mask = result
--------------------
0010 | 0010 = 0010 as well
1111 | 0010 = 1111 (No change if the bit is already 1)
1101 | 0010 = 1111 (Just sets that one bit)
xxxx | 0010 = xx1x (All the other bits remain the same)

最后它将结果存储回c中。

因此从本质上讲,它将c中的第i位(从最低有效位开始为零)。

更多细节:

// Loop through the first 8 characters in p
for(i = 0; i < 8; i++)
{
    // Grab the least significant bit of the i'th character as an int (1 or 0)
    int a = p[i] & 1;
    // If it happens to be set (was a 1)
    if(a)
    {
        // Set the corresponding (i'th) bit in c
        c |= 1 << i;
    }
}

因此,如果p的第一个值的lsb为1,则c的lsb将为1

如果p中的第二个字节的lsb为1,则c的第二个位将为1

结果是C的每个位将取P的前8个字节中每个字节的最低有效位的值

我敢打赌,如果我真的想尝试的话,可以对其进行更密集的编码,但这可能是针对性能:)