繁体   English   中英

使用按位运算符(C ++)解码Int

[英]Decoding an Int using Bitwise Operators (C++)

我一直在计划编写一个函数,该函数带有一个已将参数编码为int的int,即IE:100101010

在开始写作之前,我创建了一个测试程序以确保我了解如何对值进行解码和编码。 对它们进行编码可以立即起作用,但是对它们进行解码则效果不佳。

以下是我一直在使用的测试代码:

#include <iostream>

using namespace std;

enum Math_Init
{
    INIT_SINE = 1, INIT_COS = 10, INIT_TAN = 100,
    INIT_COT = 1000, INIT_SEC = 10000, INIT_CSC = 100000,
    INIT_ALL = 111111
};

int main()
{
    //cout << "Init Sine: " << INIT_SINE << endl;
    //cout << "Init Sine | Init Cos: " << (INIT_SINE | INIT_COS) << endl;
    //cout << "Init Sine | Init Cos | Init Sec: " << (INIT_SINE | INIT_COS | INIT_SEC)         << endl;
    //cout << "Attempting to Decode Bits..." << endl;
    int c = /*(INIT_SINE | INIT_COS | INIT_SEC);*/ 100011;
    cout << "Value of Bits: " << c << endl;
    cout << "Is Sine Present? " << (c & 1 << 0) << endl;
    cout << "Is Cos Present? " << (c & 1 << 1) << endl;
    cout << "Is Tan Present? " << (c & 1 << 2) << endl;
    cout << "Is Cot Present? " << (c & 1 << 3) << endl;
    cout << "Is Sec Present? " << (c & 1 << 4) << endl;
    cout << "Is Csc Present? " << (c & 1 << 5) << endl;
    system("PAUSE");
    return 0;
}

我无法隔离/解码int中的值,我在做什么错? 我一直在研究此问题,以解决此问题,但没有运气: http : //www.cprogramming.com/tutorial/bitwise_operators.html

您正在使用int文字(即12345 )。 默认情况下,它们为十进制,因此您认为的位数实际上是十。

您需要对位对齐的文字使用以下类型前缀之一:

012345    octal
0x12345   hexadecimal
0b010101  binary (GCC or C++14)

您的枚举器定义令人怀疑:它们是以10为基数的整数。 例如,二进制文件中的10(您的INIT_COS值)是0b1010 您的掩码INIT_ALL没有做应做的事情,也应该以不同的方式指定它。

理想情况下,您希望能够提供二进制文字,但是不幸的是,当前的C ++标准不允许这样做。

我使用的惯用法(将在编译时进行评估,因此不会造成性能损失)

INIT_SINE= 1 << 0,
INIT_COS = 1 << 1,
INIT_TAN = 1 << 2,

等等。 对于您的面具,请使用INIT_ALL = INIT_SINE | INIT_COS | INIT_TAN INIT_ALL = INIT_SINE | INIT_COS | INIT_TAN INIT_ALL = INIT_SINE | INIT_COS | INIT_TAN

我相信C ++ 14 将为您提供二进制文字(如0b1010 ),这意味着我的惯用语将被淘汰。 GCC已经允许这样做,但是请注意,它不是标准的C ++,因此出于可移植性考虑,建议您不要这样做。

Math_Init错误。 这些值是十进制数,而不是在特定位置设置了位的二进制数。 应该是这样的:

enum Math_Init
{
    INIT_SINE = 1 << 0, INIT_COS = 1 << 1, INIT_TAN = 1 << 2,
    INIT_COT = 1 << 3, INIT_SEC = 1 << 4, INIT_CSC = 1 << 5,
    INIT_ALL = INIT_SINE | INIT_COS | INIT_TAN | INIT_COT |
               INIT_SEC | INIT_CSC
};

c值表示为十进制。 这是一个效率不高的程序,它将十进制转换为二进制表示形式。 它对于指定一些十进制值可能很有用,请查看它以二进制表示的方式,然后使用蒙版播放。

int main()
{
    int cx = 27;  /*that's some random base 10 value. play with it*/
    int i;
    int flag = 0;
    cout << cx << " in binary is:" << "\n";
    for (i = 31; i >= 0; i--) {
        int mask = 1 << i;
        int bit = cx & mask;
        if (bit) {
            bit = 1;
            flag = 1;
        }
        if (flag) {
            cout << bit << " ";
        }
    }
    cout << "\n";
    return 0;
}

暂无
暂无

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

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