简体   繁体   English

位屏蔽以确定数字是正数还是负数c ++

[英]Bit masking to determine if number is positive or negative c++

I want to replicate the behaviour of a micro controller. 我想复制微控制器的行为。

If the memory location of the program counter contains 0x26 then I want to check that the value in the next memory location is positive or negative. 如果程序计数器的存储位置包含0x26那么我要检查下一个存储位置中的值是正还是负。

If it is positive then I add it to the program counter PC and if it is negative then I add it to the program counter PC , which is essentially subtracting it. 如果它为正,则将其添加到程序计数器PC ;如果它为负,则将其添加到程序计数器PC ,这实际上是将其减去。

I am using bit masking to do this but I am having issues determining a negative value. 我正在使用位掩码来执行此操作,但是在确定负值时遇到了问题。

           {
                if (value_in_mem && 128 == 128)
                {
                    cout << "\nNext byte is : " << value_in_mem << endl;
                    cout << "\nNumber is positive!" << endl;
                    PC = PC + value_in_mem;
                    cout << "\n(Program Counter has been increased)" << endl;

                }
                else if (value_in_mem && 128 == 0)
                {
                    cout << "\nNext byte is : - " << value_in_mem << endl;
                    cout << "\nNumber is negative!" << endl;
                    PC = PC + value_in_mem;
                    cout << "\n(Program Counter has been decreased)" << endl;
                }
            }

My method is to && the value_in_mem (an 8 bit signed int) with 128 ( 0b10000000 ) to determine if the most significant bit is 1 or 0, negative or postitve respectively. 我的方法是&&value_in_mem (一个8位带符号的int)与128( 0b10000000 )一起确定最高有效位分别是1还是0,分别是负数还是postitve。

value_in_mem is a 8-bit hexadecimal value and I think this is where my confusion lies. value_in_mem是一个8位十六进制值,我认为这就是我的困惑所在。 I'm not entirely sure how negative hexadecimal values work, could someone possibly explain this and the errors in my attempt at the code? 我不完全确定负十六进制值的工作方式,有人可以解释一下这以及我在尝试代码时的错误吗?

1) You're using && which is a logical AND but you should use & which is a bitwise AND . 1)您正在使用&& ,这是一个逻辑AND,但您应该使用& ,这是按位AND

// It would be better to use hex values when you're working with bits
if ( value_in_mem & 0x80 == 0x80 )
{
    // it's negative
}
else
{
    // it's positive
}

2) You can simply compare your value to 0 (if value_in_mem is declared as char ) 2)您可以简单地将您的值与0比较(如果value_in_mem被声明为char

if ( value_in_mem < 0 )
{
    // it's negative
}
else
{
    // it's positive
}

Make sure you are using correct types for your values (or cast them where it matters, if you prefer for example to have memory values as unsigned bytes most of the time (I certainly would), then cast it to signed 8 bit integer only for the particular calculation/comparison by static_cast<int8_t>(value_in_mem) ). 确保为值使用正确的类型(或将其强制转换为重要类型,例如,如果您希望在大多数情况下将内存值作为无符号字节使用(我当然会),则仅将其转换为有符号的8位整数通过static_cast<int8_t>(value_in_mem)进行特定的计算/比较。

To demonstrate the importance of correct typing, and how C++ compiler will then do all the dirty work for you, so you don't have to bother with bits and can use also if (x < 0) : 为了说明正确键入的重要性,以及C ++编译器随后将如何为您完成所有肮脏的工作,因此您不必费心使用位,并且还可以使用if (x < 0)

#include <iostream>

int main()
{
    {
        uint16_t pc = 65530;     int8_t b = 0xFF;     pc += b;
        std::cout << pc << "\n"; // unsigned 16 + signed 8
        // 65529 (b works as -1, 65530 - 1 = 65529)
    }
    {
        int16_t pc = 65530;      int8_t b = 0xFF;     pc += b;
        std::cout << pc << "\n"; // signed 16 + signed 8
        // -7 (b works as -1, 65530 as int16_t is -6, -6 + -1 = -7)
    }
    {
        int16_t pc = 65530;      uint8_t b = 0xFF;    pc += b;
        std::cout << pc << "\n"; // signed 16 + unsigned 8
        // 249 (b works as +255, 65530 as int16_t is -6, -6 + 255 = 249)
    }
    {
        uint16_t pc = 65530;     uint8_t b = 0xFF;    pc += b;
        std::cout << pc << "\n"; // unsigned 16 + unsigned 8
        // 249 (b = +255, 65530 + 255 = 65785 (0x100F9), truncated to 16 bits = 249)
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM