使用按位操作符解码Int (c++)
Decoding an Int using Bitwise Operators (C++)
我一直计划写一个函数,它接受一个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
etc。
我相信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;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)