Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中测试位宏+;_C++_Linux_Keyboard - Fatal编程技术网

C++ 在C/C+中测试位宏+;

C++ 在C/C+中测试位宏+;,c++,linux,keyboard,C++,Linux,Keyboard,我试图通过ioctl()读取linux设备的输入,我看到了许多使用“test_bit”宏的代码示例,但我找到的唯一代码是:\define test_bit(bit,array)(array[bit/8]&(1这是一个小示例,展示了如何使用test_bit。(我将其重新命名为TEST_BIT,并在下面解释原因): 请注意: >P>函数在C++中是一个坏的选择。内联函数要好得多,因为宏不是类型安全的,但函数是。在这种情况下,适当的替代方法可以是例如: inline bool test_bit(u

我试图通过ioctl()读取linux设备的输入,我看到了许多使用“test_bit”宏的代码示例,但我找到的唯一代码是:
\define test_bit(bit,array)(array[bit/8]&(1这是一个小示例,展示了如何使用
test_bit
。(我将其重新命名为
TEST_BIT
,并在下面解释原因):

请注意:

>P>函数在C++中是一个坏的选择。内联函数要好得多,因为宏不是类型安全的,但函数是。在这种情况下,适当的替代方法可以是例如:

inline bool test_bit(unsigned bit, unsigned char *array)
{
  return array[bit / 8] & (1 << (bit % 8)) != 0;
}
inline bool test_位(无符号位,无符号字符*数组)
{

返回数组[BIT/8 ] &(1)如何定义TestPixbit(BIT,数组)(数组[BIT/8)&(1)谢谢你的回答,我对C++和Linux很陌生。从我理解的,这个代码应该检查一个特定的比特被设置成一个特定字节的1。(也许我是完全错误的,从现在开始我没有得到很多帮助。但是,当我在调试中按下一个键时,我可以看到字节中的一位从0变为1,但我从未进入测试位状态。也许这只是一个误解的问题。
数组[bit/8]
将位数除以8,以解决
数组
位%8
的正确字节(实际上,分隔存储0…7的最后3位)。
1
array
应该是一个变量(或表达式),数组类型为
unsigned char
char
signed char
也可以工作,但带符号的字符可能会导致问题。)从您之前的评论中,我希望它更好:
#ifndef test_bit#define test_bit(bit,array)(array[bit/8])&(1)谢谢你的详细解释。我接受你的建议,作为一个初学者,这非常有用!我更了解我现在在做什么。你能给我解释一下这两行到底在做什么吗?
enum{nData=sizeof data/sizeof*data};enum{ndabatits=8*nData};
sizeof data/sizeof*data
将数组的大小除以第一个元素的大小。结果是数组
数据中的元素数
。将其分配给枚举数(匿名
枚举
)使其成为一个实时编译常量(C/C++中支持的唯一实名常量-在这些新的花式
constexpr
things之前)。在这种情况下,我也可以使用
const size\t nData=sizeof data/sizeof*data;
,但在其他情况下不能使用。例如,数组维度必须是编译时常量。
enum
可以在那里工作,但
const size\t nData
不能。实际上,
sizeof data
会返回byt中的数组大小你可能会想:为什么这么复杂?为什么这个
/sizeof*data
虽然不会改变结果?我认为相反:
sizeof data/sizeof*data
是一种获取数组元素数的方法,而不管元素类型如何-这就是为什么我总是这样做的原因。(我习惯了。)别忘了:这适用于数组,但如果数组作为函数参数传递,那么它们会衰减为指针。这个技巧对指针不起作用……你可以这样做:
char a[10];
-这很简单。你也可以这样做
char b[5*2];
,但你不能这样做
int a=5;char c[a*2]这是因为
5*2
可以(并且是)由编译器“在编译时”计算。查看机器代码,您会发现结果10。
a*2
可能不是由编译器计算的,因为
a
是一个变量(并且可能在运行时更改)因此,编译器必须在运行时生成计算的完整代码。在C++中不允许在编译时未知大小的数组(不按标准)。
#include <iomanip>
#include <iostream>

#define TEST_BIT(bit, array) (array[bit / 8] & (1 << (bit % 8)))

int main()
{
  unsigned char data[] = {
    (unsigned char)0xde,
    (unsigned char)0xad,
    (unsigned char)0xbe,
    (unsigned char)0xef
  };
  enum { nData = sizeof data / sizeof *data };
  enum { nDataBits = 8 * nData };
  for (unsigned i = 0; i < nDataBits; ++i) {
    std::cout << "Bit " << std::setw(2) << i << ": "
      << (TEST_BIT(i, data) ? 1 : 0) << '\n';
  }
  return 0;
}
inline bool test_bit(unsigned bit, unsigned char *array)
{
  return array[bit / 8] & (1 << (bit % 8)) != 0;
}