使用加法检索大端整数

时间:2014-03-25 19:44:18

标签: c bit-manipulation

我有这个宏

#define get32(buf) ((((*(buf))<<24)&0xff000000) + \
        (((*((buf)+1))<<16)&0x00ff0000) + \
        (((*((buf)+2))<< 8)&0x0000ff00) + \
        (((*((buf)+3)    )&0x000000ff)))

根据我的理解,假设在buff中,字节以大端方式编码,并将它们转换为32位整数,对吗?

让我感到困惑的是,我期待宏中的|运算符而不是+

2 个答案:

答案 0 :(得分:1)

使用|是常规和理智的,但是当所有内容都是无符号的并且要添加的数字具有不相交的位范围时,+会起作用。如果位的范围重叠,则加法和逻辑或不相等。

  

出于好奇,我想知道当整数为负数时如何实现这些函数。

我可能实现宏的方式是:

#define get32(buf) ((((buf)[0] & 0xFF) << 24) | \
                    (((buf)[1] & 0xFF) << 16) | \
                    (((buf)[2] & 0xFF) <<  8) | \
                    (((buf)[3] & 0xFF) <<  0))

主要区别在于线条更系统;优化器将消除<< 0操作(可能即使未使用-O标志)。这将在实践中处理负数OK(设置buf[0]的高位的数字)。

答案 1 :(得分:0)

'+'与|相同。例如: 使用+:

时,数字为345678
 340000
+005600
+000078

在做|时善意地使用位:

 340000 [as bits]
|005600 [as bits]
|000078 [as bits]

似乎没有区别。