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

西弗

我最近启动了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解释这个例子?我认为这将非常有帮助。谢谢!

比尔·K

好,

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个字节中每个字节的最低有效位的值

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有人可以向我解释这一行吗?

有人可以向我解释FindViewById(1)或FindViewById(2)背后的魔力吗?

React.js:有人可以向我详细说明这一行吗

有人可以向我解释为什么我的函数返回0而不是1吗?

有人可以向我解释函数中的一行代码吗

有人可以向我解释什么[](int i){return i%2 == 0; }是什么意思?

有人可以向我解释为什么预期 1 个位置参数但找到 0 个

斯威夫特:有人可以为我解释这种语法`numbers.sort {$ 0> $ 1}`吗?

有人可以解释一下Scala的这一行编码吗

有人可以从datepicker解释这一行代码吗

有人可以解释这一行代码吗?

有人可以向我解释Dixon的因式分解算法的这一部分吗?

有人能解释一下这个证明中的 X、I 和 Pr 是什么吗?还有为什么第一个 sigma 从 j=i+1 开始?

有人可以为我解释一下 - for (i = 0; i=10; i++)

有人可以解释((.. $(。))(==)1(1+)0的含义

有人可以解释指向我的指针吗

有人可以向我解释话题吗?

有人可以向我解释这种行为吗?

有人可以向我解释这种行为吗?

有人可以向我解释这种行为吗?

有人可以向我解释什么是stty吗?

有人可以向我解释逻辑问题吗

有人可以向我解释这段代码吗

有人可以向我解释一下LinkedList程序中的C ++代码吗?

这个C代码的输出是49,但是有人可以向我解释一下吗?

有人可以向我解释scanf如何与C的多个输入会话一起工作吗?

有人可以解释“ heroku ps:scale web = 1”

有人可以向我解释一下:“ create({email:emailArg} = {}){}”吗?

有人可以向我解释一下这段代码是如何工作的吗?