在C中连续读取位

时间:2013-05-11 14:06:08

标签: c definition

我正在尝试将一些代码从Python转换为C.我已经完成了以下部分以外的所有工作。所有变量都被定义为int s。我认为这个问题与指针和地址有关但我无法解决。

for(j=0; j<12; j++)
{
  digitalWrite(CLOCK, 1);
  sleep(0.001);
  bit = digitalRead(DATA_IN);
  sleep(0.001);
  digitalWrite(CLOCK, 0);
  value = bit * 2 ** (12-j-1);  // error
  anip = anip + value;
  printf("j:%i bit:%i value:%i anip:%i", j, bit, value, anip);
}

错误为invalid type argument of unary ‘*’ (have ‘int’)

3 个答案:

答案 0 :(得分:7)

C没有取幂运算符,我猜你做**

您可以使用例如pow如果可以将浮点值的结果转换为整数。

答案 1 :(得分:7)

在C中,1<<i是将i提升为2的力量的最佳方法。

使用ints进行位操作,因为它们的大小因平台而异。使用uint32_t中的/usr/include/stdint.h

答案 2 :(得分:2)

sleep()函数采用整数参数并等待指定的秒数。参数0.001变为0,这可能不是您想要的。相反,请尝试usleep(),它接受​​一个代表毫秒的参数。

其他答案将解决将任意数字提升为幂或2的幂的一般问题,但这是一个非常具体的案例。

循环的目的是从MSB到LSB串行读取11位并将它们转换为整数。您已经展示的实现尝试通过读取一点,将其移动到正确的位置并将结果累积到anip来实现此目的。但是有一种更简单的方法:

anip = 0;
for (j=0; j<12; ++j) {
  // Pulse the CLOCK line and read one bit, MSB first.
  digitalWrite(CLOCK, 1);
  usleep(1);
  bit = digitalRead(DATA_IN);
  usleep(1);
  digitalWrite(CLOCK, 0);

  // Accumulate the bits.
  anip <<= 1;    // Shift to make room for the new bit.
  anip += bit;   // Add the new bit.

  printf("j:%i bit:%i anip:%i", j, bit, anip);
}

例如,假设前4位是1001。然后输出

j:0 bit:1 anip:1
j:1 bit:0 anip:10
j:2 bit:0 anip:100
j:3 bit:1 anip:1001

当循环完成时,anip将包含整个位序列的值。这是用于连续读取数据的相当标准的习惯用法。

虽然使用uint32_t的建议通常是合适的,但C standardint定义为至少 16位,这超过了你的12位需要(包括符号位,如果anip已签名)。此外,您可能正在为特定平台编写此内容,因此不担心可移植性。