我一直在计划编写一个带有编码参数的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
答案 0 :(得分:3)
您正在使用int
文字(即12345
)。默认情况下它们是十进制的,所以你认为比特实际上是数十。
您需要使用以下类型前缀之一来进行位对齐文字:
012345 octal
0x12345 hexadecimal
0b010101 binary (GCC or C++14)
答案 1 :(得分:2)
您的枚举器定义是可疑的:它们是基数为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
等。
我相信C ++ 14 将给你二进制文字(如0b1010
),这意味着我的习语将会过时。 GCC已经允许这样做,但请注意它是不标准C ++,所以为了便于携带,我建议反对它。
答案 2 :(得分:0)
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;
}