user-0 提问: 右移和 &0xff

回复:
user: user-1
content: 怎么赋值就反向提取  赋值是右移，提取时就左移  把各个位重新组合到相应位置就还原了  建议拿个纸在上面画一下容易明白

user: user-2
content: 引用 2 楼 CKRGD 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 你的移位操作并没有将gx.latitude 和   gx.nshemi修改，它们还是原来的值。因为你的移位只是对变量值的读操作，并没有写（修改） 关键是我不知道它们原来的值，我是收到下位机数据 3D 17 A5 4E 00  知道他是这么操作，我需要计算gx.latitude gx.nshemi的值[/quote]  m_data.p_packet_data[strlen++]=gx.latitude>>24; // 最高字节 m_data.p_packet_data[strlen++]=(gx.latitude>>16)&0xFF;// 次高字节 m_data.p_packet_data[strlen++]=(gx.latitude>>8)&0xFF; //第三个字节 m_data.p_packet_data[strlen++]=(gx.latitude)&0xFF; // 最低字节；  每个字节都知道是什么值了，再去求gx.latitude，通过移位过去就好了。 gx.nshemi这个值不需要移位就可以。

user: user-0
content: unsigned char buf[1024]={0x3D, 0x17, 0xA5, 0x4E, 0x00}; 	long latitude=((long)buf[0])<<24 | ((long)buf[1])<<16 | ((long)buf[2])<<8 | ((long)buf[3]); 	unsigned char nshemi=buf[4]; 	printf("%ld \t", latitude); 	printf("%c \t", nshemi);  	//验证 	unsigned char data[1024]; 	data[0]=latitude>>24; // 18 	data[1]=(latitude>>16)&0xFF;// 19  	data[2]=(latitude>>8)&0xFF; // 20 	data[3]=(latitude)&0xFF; // 21 	data[4]=nshemi;  //22  	for(int i = 0; i < 5; i++) 	{ 		printf("%x   ", data[i]); 	} //结果  1024959822          3d  17  a5  4e  0     感谢6楼

user: user-3
content: unsigned char buf[1024]={0x3D,0x17,0xA5,0x4E,0x00}; long latitude=((long)buf[0])<<24|((long)buf[1])<<16|((long)buf[2])<<8|((long)buf[3]); unsigned char nshemi=buf[4];

user: user-4
content: LZ你代码没贴全吧？右移n位，可以看成是乘以2的n次方，&0xff是求某一位的值。另外printf("%x ",m_data.p_packet_data[xxx]);xxx具体指哪一位的值？你都没说清楚。3楼已经告诉你了正确答案，m_data.p_packet_data[i]中的i就是你的xxx

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:m_data.p_packet_data[strlen++]=gx.latitude>>24; // 18 m_data.p_packet_data[strlen++]=(gx.latitude>>16)&0xFF;// 19  m_data.p_packet_data[strlen++]=(gx.latitude>>8)&0xFF; // 20 m_data.p_packet_data[strlen++]=(gx.latitude)&0xFF; // 21 m_data.p_packet_data[strlen++]=gx.nshemi;  3D       17       A5       4E       00 00111101 00010111 10100101 01001110 00000000 gx.latitude                         gx.nshemi 0x3D17A54E                          0x00  int i=strlen-5;//18 gx.latitude=*(long *)&m_data.p_packet_data[i]; gx.nshemi=*(unsigned char *)&m_data.p_packet_data[i+4];  没看懂，我没有那个变量m_data.p_packet_data[i]， 我是收到下位机数据3D       17       A5       4E       00  下位机是那样计算

user: user-3
content: m_data.p_packet_data[strlen++]=gx.latitude>>24; // 18 m_data.p_packet_data[strlen++]=(gx.latitude>>16)&0xFF;// 19  m_data.p_packet_data[strlen++]=(gx.latitude>>8)&0xFF; // 20 m_data.p_packet_data[strlen++]=(gx.latitude)&0xFF; // 21 m_data.p_packet_data[strlen++]=gx.nshemi;  3D       17       A5       4E       00 00111101 00010111 10100101 01001110 00000000 gx.latitude                         gx.nshemi 0x3D17A54E                          0x00  int i=strlen-5;//18 gx.latitude=*(long *)&m_data.p_packet_data[i]; gx.nshemi=*(unsigned char *)&m_data.p_packet_data[i+4];

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:你的移位操作并没有将gx.latitude 和   gx.nshemi修改，它们还是原来的值。因为你的移位只是对变量值的读操作，并没有写（修改） 关键是我不知道它们原来的值，我是收到下位机数据 3D 17 A5 4E 00  知道他是这么操作，我需要计算gx.latitude gx.nshemi的值

user: user-2
content: 你的移位操作并没有将gx.latitude 和   gx.nshemi修改，它们还是原来的值。因为你的移位只是对变量值的读操作，并没有写（修改）

user: user-5

user: user-6
content: 你下位机给你的是一个4字节的数据，所以按6楼的方法是对的