【问题标题】:Bitwise AND operator not working for hexadecimal inputs位与运算符不适用于十六进制输入
【发布时间】:2020-10-06 00:12:52
【问题描述】:

我正在用 C 语言编写一个程序来获取无符号数的前 4 位。我不知道为什么,但是每次我为该无符号数字的参数(该参数也称为“数字”)输入一个十六进制值时,它返回的结果为 0。我在 main 中包含了一个十六进制值,即假设返回 9——因为二进制的前四位是 1001——来说明这一点。我做错了什么导致按位运算符不工作?

    unsigned int returnedBits(unsigned int number, int bits, int startingPos) { 
    
    int theNumberShifted = (number >> (startingPos));
    int theNumberOfBits = ((1 << bits) - 1);
        
      return theNumberOfBits & theNumberShifted; 
      
    } 
      
    // Driver code 
    int main() 
    { 
        int unsigned number = 0x1264c000, k = 4, p = 0; 
        printf("The extracted number is %d",  
                   returnedBits(number, k, p)); 
        return 0; 
    } 

【问题讨论】:

  • 你期待什么?
  • 我希望它返回“9”。我认为所有按位运算都是以二进制完成的,所以前 4 位应该是原始十六进制数 0x1264c000 的“1001”
  • 你知道字节序吗?
  • @Ôrel endianess 在这里无关紧要,这些都是逻辑操作,它们的行为都相同
  • 好的,我认为这里的混淆是您所说的“前”四位“。您似乎是指第一个非零最高有效位。在您的情况下,这是 101 = 9。这是一个更棘手的问题。您所拥有的是读取四个最低有效位的代码。顺便说一句,与十六进制或十进制无关

标签: c


【解决方案1】:

这是预期的行为:

0x1264c000 &
       0xf
__________
         0

试试 k = 16

0x1264c000 &
    0xffff
__________
    0xc000

k=24

0x1264c000 &
  0xffffff
__________
  0x64c000

【讨论】:

  • 我认为比较会以二进制进行,因为 C 中内存中的所有内容都是二进制的。究竟需要在程序中添加什么才能让它获取原始十六进制数的二进制前四位,然后将其作为普通十进制返回?
  • @bleplop 你的代码是正确的并且做你想做的事。也许我们忽略了您所说的“第一”是指最重要的还是最不重要的?
  • 我想我的意思是“最重要的”我试图抓住 000000000000101100000110010000010010 中的第一个“1011”
  • 你不应该用比特来思考,而应该只用字节来思考
  • @bleplop 你给出的二进制数是十六进制的 0xb06412,而不是 0x1264c000。你是怎么想到的?
【解决方案2】:

请参考以下代码。

unsigned int returnedBits(unsigned int number, int bits, int startingPos) {
    number <<= startingPos;
    unsigned int maskbit = (1 << 31);
    while ((number & maskbit) == 0) 
        number <<= 1;
    return number >> (32 - bits);
}

// Driver code 
int main()
{
    unsigned int number = 0x1264c000, k = 4, p = 0;
    printf("The extracted number is %d",
        returnedBits(number, k, p));
    return 0;
}

【讨论】:

  • 我们不知道位的顺序,只知道字节的顺序
  • @Ôrel 你是什么意思?你是说C没有定义位的顺序。它当然定义了它们的行为方式,即使它没有说明它们在记忆中的样子。
  • 是的,位不可寻址,只有字节可寻址。
  • OP 想要前 n 个最高有效位,这是一个非常困难的问题
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多