搜索二进制数

时间:2019-01-30 14:29:21

标签: c binary bit

我已经定义了一些值,请参见下文,我无法正确使用它们。

#define add 000001
#define sub 000010
#define jmp 000111 

#define IMM 10000
#define ADDR 10001

在我的代码中,我将地址设置为十六进制。

            parameter1 = false;
            parameter1 = false; 

            uint64_t data = 0xffffffff05001e00;

            uint16_t vector[4];
            memcpy(vector, &data, sizeof(uint64_t));

            int currentPosition = 0;

            while (currentPosition < 4) {

                header = vector[currentPosition];//header

                opcode = header >> 0xA & 0x3F;
                src1 = header >> 0x5 & 0x1F;
                src2 = header & 0x1F;

                if (src1 == ADDR || src1 == IMM) { parameter1 = true; }
                if (src2 == ADDR || src2 == IMM) { parameter2 = true; } 
                ....
                currentPosition++;
           }
在这种情况下,

header = 1e00(因为它是vector [0])

将执行以下操作: 操作码= 0x7,src1 = 0x10,src2 = 0x0。

这意味着二进制:000111 10000 00000-> jmp IMM NULL

首次调用 if 时,parameter1的值应为true;但这从来没有发生过。为什么会这样呢? 我没有正确定义IMM值?

谢谢!

2 个答案:

答案 0 :(得分:4)

您定义的数字都不是二进制数字

#define add 000001      // octal literals because it starts with 0
#define sub 000010          
#define jmp 000111 

#define IMM 10000       // decimal literals 
#define ADDR 10001

它们都不是您在代码中假定的二进制表示形式。

自C ++ 14起,您可以将二进制文字写为(例如来自https://en.cppreference.com/w/cpp/language/integer_literal的示例):

int b = 0b101010; // C++14

通常,我强烈建议您不要使用#define,除非您故意选择摆脱使用宏所带来的所有麻烦。

答案 1 :(得分:0)

要访问定义的值,我只需要这样重写它们:

  #define add 0x1
  #define sub 0x2
  #define jmp 0x7

  #define IMM 0x10
  #define ADDR 0x11

现在工作正常。