C按位运算问题

时间:2011-08-25 15:36:39

标签: c++ c bit-manipulation

有人可以帮我理解这段代码的用途。它看起来像是从一个位数组中生成一个整数。我不知道它是怎么做的。为什么有一个按位&对OxFF的操作? Inst这会产生相同的结果吗?

//first take the first  4 bytes read out of the socket into an array and
//make them a 32 bit integer

        long ltemp =0;
        long ltemp2 = 0;
        ltemp  = ltemp | (unsigned char)(analog_val_ptr[0] & 0xff);
        ltemp  = ltemp << 24;
        ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[1] & 0xff);
        ltemp2 = ltemp2 << 16;
        ltemp = ltemp2 | ltemp;
        ltemp2 =0;
        ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[2] & 0xff);
        ltemp2 = ltemp2 << 8;
        ltemp = ltemp2 | ltemp;
        ltemp  =  ltemp | (unsigned char)(analog_val_ptr[3] & 0xff);

///then convert that integer into a float, passing

4 个答案:

答案 0 :(得分:3)

这是一种非常啰嗦的方式,只需将4个8位字节转换为32位长。

and0xff只是确保只使用每个值的低8位(0xff == binary 11111111)。

位移(以8的倍数表示)只是为了让每个字符都处于正确的位置。

整个事情可以用以下内容代替:

unsigned long ltemp  = (unsigned char)(analog_val_ptr[0] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[1] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[2] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[3] & 0xff);

或者,或者(假设它们可用),使用正确的工具,特别是htonl()ntohl()

答案 1 :(得分:1)

看起来它正在构建一个 bytes 数组中的整数。可能analog_val_ptr[]intshort值的数组,此代码旨在将每个条目视为一个字节。屏蔽是为了防止符号位泛滥目标变量。

答案 2 :(得分:1)

看起来它正在进行端点独立转换。

答案 3 :(得分:0)

var = 0x ? ? ? ? ? ? ? ?
         & & & & & & & & 
      0x 0 0 0 0 0 0 f f 
      ------------------
         0 0 0 0 0 0 ? ?

AND运算后,低{8}位将与var & 0xff一起找到。它只是削减所需的部分,掩盖。

上面的代码只是将4个数组元素的低字节粘贴到变量ltemp中作为long int。