打破32位整数,并使用后半部分16位形成一个int

时间:2014-04-04 04:27:40

标签: ios objective-c bit-manipulation

我正在制作一个从服务器下载32位整数的应用程序,并将第一个16位和第二个16位用于不同目的...

我负责第二个16bit,应该用来形成一个int,我知道我应该用bitwise操作来做这个,但是无法实现,下面是我正在使用的代码,请给我更多信息

        //CID is a 32bit integer, in nslog it shows as 68913219 - its different for every user
        Byte lowByte = (CID>>16)&0xFF; //the 3rd byte
        Byte highByte = (CID>>24)&0xFF; //the 4th byte
        uint16_t value = lowByte & highByte; //combine, but the result is 0.

3 个答案:

答案 0 :(得分:4)

uint16_t value = lowByte & highByte; //combine, but the result is 0.

这不是你将两个字节合并为一个uint16_t的方式:你AND将它们放在适当位置,而你需要移位高字节,OR它与低字节:

uint16_t value = lowByte | (((uint16_t)highByte) << 8);

然而,就可读性而言,这是次优的:如果你从一个32位整数开始,你需要删除高16位,你可以简单地移动16,并用0xFFFF掩码 - 即与切出第三个字节的方式相同,但使用16位掩码。

答案 1 :(得分:0)

您不应该逐字节地执行此操作。试试这个:

   //CID is a 32bit integer, in nslog it shows as 68913219 - its different for every user
    uint16_t value = (CID>>16)&0xffff;

答案 2 :(得分:0)

您也可以使用NSData。

如果你有这个整数:

int i = 1;

您可以使用:

NSData *data = [NSData dataWithBytes: &i length: sizeof(i)];

然后,获得第二个16位:

int16_t recover; [data getBytes: &recover range: NSMakeRange(2, 2)]

然后你的16位开启&#34;恢复&#34;。

也许这种方式不像位操作那么有效,但它更清晰。

:D