Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C位运算问题_C++_C_Bit Manipulation - Fatal编程技术网

C++ C位运算问题

C++ C位运算问题,c++,c,bit-manipulation,C++,C,Bit Manipulation,有人能帮我理解这个代码是怎么回事吗。它看起来像是从一个位数组中生成一个整数。我不知道它是怎么做到的。为什么在OxFF上有一个按位&操作?难道这会产生同样的结果吗 //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 = l

有人能帮我理解这个代码是怎么回事吗。它看起来像是从一个位数组中生成一个整数。我不知道它是怎么做到的。为什么在OxFF上有一个按位&操作?难道这会产生同样的结果吗

//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个字节放入数组并
//将它们设为32位整数
长ltemp=0;
长ltemp2=0;
ltemp=ltemp |(无符号字符)(模拟值ptr[0]&0xff);
ltemp=ltemp这是一种非常冗长的方法,只需将四个8位字节转换为32位字节

0xff
的绑定只是确保只使用每个值的低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);
unsigned long ltemp=(unsigned char)(模拟值ptr[0]&0xff);
ltemp=(ltemp这是一种非常冗长的方法,只需将四个8位字节转换为32位字节

0xff
的绑定只是确保只使用每个值的低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);
unsigned long ltemp=(unsigned char)(模拟值ptr[0]&0xff);

ltemp=(ltemp它看起来像是从字节数组中构建一个整数。它可能是
analog\u val\u ptr[]
是一个
int
short
值的数组,此代码旨在将每个条目视为一个字节。屏蔽是为了防止符号位溢出目标变量。

它看起来像是从字节数组中构建一个整数。可能是
模拟值\u ptr[]
是一个
int
short
值的数组,此代码旨在将每个条目视为一个字节。屏蔽是为了防止符号位溢出目标变量

var = 0x ? ? ? ? ? ? ? ?
         & & & & & & & & 
      0x 0 0 0 0 0 0 f f 
      ------------------
         0 0 0 0 0 0 ? ?
在执行AND操作后,将使用
var&0xff
找到较低的8位。这是一种仅剪切所需部分的方法,即屏蔽

上面的代码只是将4个数组元素的低位字节作为长整数粘贴到变量
ltemp

在执行AND操作后,将使用
var&0xff
找到较低的8位。这是一种仅剪切所需部分的方法,即屏蔽


上面的代码只是将4个数组元素的较低字节粘贴到变量
ltemp
中,作为一个长整数。

看起来它将进行与endian无关的转换。

看起来它将进行与endian无关的转换。

模拟值ptr的类型是什么?看起来程序员确实在尝试双重转换当然可以使用
&0xFF
并将其转换为
无符号字符
。我认为这两种方法都可以单独使用。这是一个字节,数据是从一个socket输入的,这是模拟值ptr的类型?看起来程序员正试图通过使用
&0xFF
并将其转换为
无符号字符
。这两种方法都可以我想这是一个字节,数据是从一个sockett中传入的
&0xff
和转换到
无符号字符
是完全冗余的。其中一个应该被删除,可能是转换。就样式而言,最好将结果设置为
无符号长
,以确定结果。@R,我考虑到
char
可能超过8位:-)不,实际上,你可能是对的,但是,因为我说了“类似于…”,我将保持原样。
&0xff
和强制转换为
无符号字符
是完全冗余的。其中一个或另一个应该删除,可能是强制转换。就样式而言,最好将结果设置为
无符号长
,以明确结果。@R,我考虑到
字符
可能超过8位:-)不,事实上,你可能是对的,但是,既然我说了“像…”之类的话,我就让它保持原样。