C - 按位连接导致信息丢失

标签 c bit-manipulation bitwise-operators bit-shift bitwise-or

我有五个短类型变量,我想将它们连接成 32 位无符号 int 类型。我需要连接五个短变量。这些变量的名称称为 opcode(5 位)、reg1(4 位)、reg2(4 位)、reg3(4 位)、extension(3 位)和 addr_constant(12 位)。现在我的代码不适用于一种情况,我不知道为什么。我在下面列出了我的代码。

这段代码的目的是将某些值转换为 32 位机器指令,这意味着即使我得到了等效的值,我仍然需要有一个 32 位指令。

...
unsigned int *const word;
unsigned short opcode = 1;
unsigned short reg1 = 3; 
unsigned short reg2 = 4;
unsigned short reg3 = 5;
unsigned short extension = 0;
unsigned int addr_constant = 0;

unsigned int machine_word = 0;
machine_word = machine_word | (opcode << 27);
machine_word = machine_word | (reg1 << 23);
machine_word = machine_word | (reg2 << 19);
machine_word = machine_word | (reg3 << 15);

machine_word = machine_word | (extension << 12);
machine_word = machine_word | addr_constant;

*word = machine_word
return 0;
...

二进制形式的输出应该是:

0000 1001 1010 0010 1000 0000 0000 0000.

但现在是:

1001 1010 0010 1000 0000 0000 0000. 

如您所见,它错过了前 4 个零。

在下面的测试中,“word”是:unsigned int *const word。在上面代码的末尾,我写了“*word = machine_word”。在测试中,它比较:“word == 0x09a28000” 我没有通过以下测试。

assert(word == 0x09a28000);

最佳答案

也许问题只是结果解释。我运行了以下代码,它基于您提供的算法,并对逻辑运算和结果打印进行了一些修改。操作的核心逻辑与您发布的内容没有变化,所以结果可能是误读的。

代码如下:

#include <stdio.h>

int main() {
    int i, j, mask;

    unsigned short opcode = 1;
    unsigned short reg1 = 3; 
    unsigned short reg2 = 4;
    unsigned short reg3 = 5;
    unsigned short extension = 0;
    unsigned int addr_constant = 0;

    unsigned int machine_word = 0;
    machine_word |= opcode << 27;
    machine_word |= reg1 << 23;
    machine_word |= reg2 << 19;
    machine_word |= reg3 << 15;

    machine_word |= extension << 12;
    machine_word |= addr_constant;

    for (i = 7; i >= 0; i--) {
        for (j = 3; j >= 0; j--){
            printf("%d", (machine_word & 0x00000001 << (4 * i + j)) >> (4 * i + j));
        }
        printf(" ");
    }
    printf("\n");
    return 0;
}

代码给出以下输出:

0000 1001 1010 0010 1000 0000 0000 0000

这应该是您正在搜索的结果,它对应于161644544(0x9A28000)的无符号整数值。

关于C - 按位连接导致信息丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52590504/

相关文章:

c - c 中的动态类型

c - 如何使用按位运算符?

MySQL 按位运算

c++ - 查找数字是否为2的幂的时间复杂度

c++ - 为什么作用域枚举允许使用 |使用先前分配的值进行初始化时的运算符?

c - 这个 "hello world!"程序是如何工作的?

c - C 中的二维数组是否可以按升序排序?如果是这样,怎么办?

c - 为数组中的每个元素添加值?

java - 使用音频字节数据创建反相/反相声音/噪声消除

perl - Perl 中的位操作