我正在解决一个需要将整数转换为特殊文本编码的问题。要求声明I将int打包成字节,然后清除最重要的位。我使用的是bitwise运算符,我不确定如何清除最重要的位。这是我到目前为止使用的问题和方法:
问题:
对于此任务,您需要编写一个包含一对
功能的小程序编码功能
此函数需要接受14位范围内的有符号整数[-8192 .. + 8191]并返回4个字符的字符串。
编码过程如下:
2.将该值放入两个字节,以便清除每个字节的最高位
未编码的中间值(作为16位整数):
00HHHHHH HLLLLLLL
编码值:
0HHHHHHH 0LLLLLLL
1 of 3
示例值:
未编码(十进制)|中级(十进制)|中级(十六进制)|编码(十六进制)
0 | 8192 | 2000年| 4000
-8192 | 0 | 0000 | 0000
8191 | 16383 | 3fff | 7F7F
2048 | 10240 | 2800 | 5000
-4096 | 4096 | 1000 | 2000
我的功能
-(NSString *)encodeValue{
// get the input value
int decValue = [_inputValue.text intValue];
char* bytes = (char*)&decValue;
NSNumber *number = @(decValue+8192); //Add 8192 so that the number can't be negative, because we're about to lose the sign.
u_int16_t shortNumber = [number unsignedShortValue]; //Convert the integer to an unsigned short (2 bytes) using NSNumber.
shortNumber = shortNumber << 1; // !!!! This is what I'm doing to clear the MSB !!!!!!!
NSLog(@"%hu", shortNumber);
NSString *returnString = [NSString stringWithFormat:@"%x", shortNumber]; //Convert the 2 byte number to a hex string using format specifiers
return returnString;
}
我正在使用shift按位运算符来清除MSB,我得到了几个值的正确答案,但不是每次都得到。
答案 0 :(得分:1)
如果我理解正确,那么我相信你是在追求这样的事情:
u_int16_t number;
number = 0xFFFF;
number &= ~(1 << ((sizeof(number) * 8) - 1));
NSLog(@"%x", number); // Output will be 7fff
工作原理:
答案 1 :(得分:0)
你误解了你的任务。
你不应该在任何地方清除最重要的位。你有14位。您应该将这14位分成两组,每组7位。由于一个字节有8位,因此将7位存储到一个字节将使最高有效位清零。
PS。为什么你在使用NSNumber?如果这是作业,我会让你单独使用NSNumber,无论代码的其余部分是什么。
PS。什么是这个char *字节应该是有益的?
PS。你没有在任何地方清除任何最重要的位。您有一个包含14个有效位的无符号短路,因此清除了两个最高有效位。您将数字向左移动,因此始终清除的最高有效位保持清零,但第二个最重要的位不是。而这一切与你的任务无关。