按位运算符:如何清除最重要的位?

时间:2014-08-30 20:50:38

标签: objective-c bitwise-operators

我正在解决一个需要将整数转换为特殊文本编码的问题。要求声明I将int打包成字节,然后清除最重要的位。我使用的是bitwise运算符,我不确定如何清除最重要的位。这是我到目前为止使用的问题和方法:

问题:

对于此任务,您需要编写一个包含一对

功能的小程序
  1. 将整数转换为特殊文本编码
  2. 编码功能

    此函数需要接受14位范围内的有符号整数[-8192 .. + 8191]并返回4个字符的字符串。

    编码过程如下:

    1. 将8192添加到原始值,因此其范围转换为[0..16383]
    2. 2.将该值放入两个字节,以便清除每个字节的最高位

      未编码的中间值(作为16位整数):

      00HHHHHH HLLLLLLL

      编码值:

      0HHHHHHH 0LLLLLLL

      1 of 3

      1. 将两个字节格式化为单个4个字符的十六进制字符串并将其返回。
      2. 示例值:

        未编码(十进制)|中级(十进制)|中级(十六进制)|编码(十六进制)

        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,我得到了几个值的正确答案,但不是每次都得到。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么我相信你是在追求这样的事情:

u_int16_t number;
number = 0xFFFF;
number &= ~(1 << ((sizeof(number) * 8) - 1));
NSLog(@"%x", number); // Output will be 7fff

工作原理:

  • sizeof(数字)* 8 为您提供输入数字中的位数(例如,u_int16_t为16)
  • 1&lt;&lt; (数字中的位数 - 1)为您提供仅具有MSB集的掩码(例如,0x8000)
  • 〜(mask)为您提供掩码的按位NOT(例如0x7fff)
  • 使用您的号码对掩码进行AND操作,然后仅清除MSB,而将其他所有其他内容清除

答案 1 :(得分:0)

你误解了你的任务。

你不应该在任何地方清除最重要的位。你有14位。您应该将这14位分成两组,每组7位。由于一个字节有8位,因此将7位存储到一个字节将使最高有效位清零。

PS。为什么你在使用NSNumber?如果这是作业,我会让你单独使用NSNumber,无论代码的其余部分是什么。

PS。什么是这个char *字节应该是有益的?

PS。你没有在任何地方清除任何最重要的位。您有一个包含14个有效位的无符号短路,因此清除了两个最高有效位。您将数字向左移动,因此始终清除的最高有效位保持清零,但第二个最重要的位不是。而这一切与你的任务无关。