C++ C++;位向哪个方向移动
我很难理解应该以哪种方式将位从一个结构的一部分转换到另一个结构。我正在编写一个仅在Windows/Intel系统上使用的应用程序 旧结构(数据字节): 新结构(ReturnData和DataByte): 位0到5应该是0,因为该数据在现有记录中是未知的。我认为使用位掩码和移位转换到新结构:C++ C++;位向哪个方向移动,c++,bit-manipulation,C++,Bit Manipulation,我很难理解应该以哪种方式将位从一个结构的一部分转换到另一个结构。我正在编写一个仅在Windows/Intel系统上使用的应用程序 旧结构(数据字节): 新结构(ReturnData和DataByte): 位0到5应该是0,因为该数据在现有记录中是未知的。我认为使用位掩码和移位转换到新结构: New->ReturnData = (Old->DataByte & 0x07)>>1 | (Old->DataByte & 0x38)>>2; Ne
New->ReturnData = (Old->DataByte & 0x07)>>1 | (Old->DataByte & 0x38)>>2;
New->DataByte = Old->DataByte & 0xC0;
对吗?第一个3位(&0x07)移位
>1
成为第一个,第二个3位(&0x38)移位>2
成为第二个字节。。或者说,这种转变是另一种方式,就像英特尔是另一个终端一样 位0是位0,与端点无关。Endianness会影响内存中的字节顺序,这只有在您想重新解释或跨线路发送数据时才重要。数学总是内在一致的
位0-2为0x07
,位3-5为0b0011 1000
,即0x38
。现在,在新的数据结构中,“退货编号”保持不变,“退货编号”只是向上移动一(从3-5)到(4-7)。这就是:
New->ReturnData = (Old->DataByte & 0x07) // these bits stay in the same place
| ((Old->DataByte & 0x38) << 1); // these shift up one
New->ReturnData=(Old->DataByte&0x07)//这些位保持在同一位置
|((Old->DataByte&0x38)位0是位0,与endianness无关。endianness会影响内存中的字节顺序,这只在您要重新解释或跨线路发送数据时才重要。数学始终在内部保持一致
位0-2将是0x07
,位3-5将是0b0011 1000
,即0x38
。现在在新的数据结构中,“返回编号”保持在同一位置,“返回编号”将向上移动一(从3-5)到(4-7)。因此:
New->ReturnData = (Old->DataByte & 0x07) // these bits stay in the same place
| ((Old->DataByte & 0x38) << 1); // these shift up one
New->ReturnData=(Old->DataByte&0x07)//这些位保持在同一位置
|((Old->DataByte&0x38)当移位位时,你不必关心尾数。当你有X=Y>>1
时,不管尾数是多少,X总是比Y小(或等于零)。当移位位时,你不必关心尾数。当你有X=Y>>1
时,X总是比Y小(或等于零)谢谢你澄清了这一点,巴里,所以我的理解是错误的,endianness更多的是与单词中的字节有关,而不是字节本身。谢谢你澄清了这一点,巴里,所以我的理解是错误的,endianness更多的是与单词中的字节有关,而不是字节本身。
New->ReturnData = (Old->DataByte & 0x07) // these bits stay in the same place
| ((Old->DataByte & 0x38) << 1); // these shift up one