【问题标题】:Search binary number搜索二进制数
【发布时间】:2019-02-19 02:47:40
【问题描述】:

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

#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 值?

谢谢!!!

【问题讨论】:

  • 你的常量都不是二进制的; addsubjmp 是八进制文字; IMMADDR 是十进制文字。二进制000111 是七,而jmp 是七十三,二进制10000 是十六,而IMM 是一万。
  • 将您的定义(尽管使用constexpr 更好)写成0b0000010b000010 等,这将强制它们是二进制的。
  • memcpy(vector, &amp;data, sizeof(uint64_t)); 是个坏主意。您的代码将取决于我们计算机的字节序。

标签: c binary bit


【解决方案1】:

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

#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,除非您故意选择遇到使用宏带来的所有麻烦。

【讨论】:

    【解决方案2】:

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

      #define add 0x1
      #define sub 0x2
      #define jmp 0x7
    
      #define IMM 0x10
      #define ADDR 0x11
    

    现在它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2014-07-10
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多