Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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语言中,如何将几个布尔值转换为int值,其位值是不同测试的结果_C_Int - Fatal编程技术网

在C语言中,如何将几个布尔值转换为int值,其位值是不同测试的结果

在C语言中,如何将几个布尔值转换为int值,其位值是不同测试的结果,c,int,C,Int,我想将几个测试转换为int,其中的位是测试的结果: int i=0; if (m>speed0) i|=0B00001; if (m>speed1) i|=0B00010; if (m>speed2) i|=0B00100; if (m>speed3) i|=0B01000; 这似乎很慢。有更好的办法吗?速度非常重要(我在arduino上)这个怎么样: int i = (m>speed0) | ((m>speed1)<<1) |

我想将几个测试转换为int,其中的位是测试的结果:

int i=0;
if (m>speed0) i|=0B00001;
if (m>speed1) i|=0B00010;
if (m>speed2) i|=0B00100;
if (m>speed3) i|=0B01000;
这似乎很慢。有更好的办法吗?速度非常重要(我在arduino上)

这个怎么样:

int i = (m>speed0) | 
    ((m>speed1)<<1) |
    ((m>speed2)<<2) |
    ((m>speed3)<<3)
inti=(m>speed0)|

((m>speed1)您可以尝试的一件事是构建一个“
if
-gradder”,只对
i
进行一次写入;方法是将较低的位滚动到较高的测试值中,并颠倒测试顺序

int i;
if (m > speed3)     i = B00001111;
else if(m > speed2) i = B00000111;
else if(m > speed1) i = B00000011;
else if(m > speed0) i = B00000001;
else
 i = 0;
这也减少了读-修改-写操作,因为它总是对
i
进行单次写入。您仍然需要对此进行分析,我真的不能说它是否会更快

哦,看起来像二进制前缀的东西(B)是一个,在C语言中不是标准的。我想它只是256个预处理器宏。

我会选择“if binary tree”,因为它是可伸缩的,并且应该有log2(n)的性能:

inti=0;//默认值m<0
如果(m>速度2)
如果(m>速度3)
i=B00001111;//m>速度3
其他的
i=B00000111;//m>速度2
其他的
如果(m>速度1)
i=B00000011;//m>速度1
否则,如果(m>速度0)
i=B00000001;//m>速度0

请对此进行分析,因为跳转和内存访问时间高度依赖于硬件架构。

通常,Arduino不会对Arduino进行大量分支预测。:)在Arduino上?分支预测?@放松:哦,我读过头了。编辑了答案。但请注意,即使在Cortex-M3上,由于有三个步骤的管道,当分支预测失误时,也会经历一个周期。@gexicide是的。。。但与大多数(经典)Arduinos中的AVR 8位控制器相比,Cortex-M3是一个巨大的尖叫怪物在一个有(不知道Arduino是否是这样)的平台上,我认为这是非常快的(好吧,考虑到你的编译器是有能力的)。你有没有分析、衡量和基准测试过这是一个瓶颈?我认为编译器只是像gexicide的代码一样对它进行优化……也许尝试类似的东西?访问位字段是否更快,或者实现(在程序集级别)是否相同?
int i = 0; // Default m < speed 0

if(m > speed2)
  if (m > speed3)
    i = B00001111; // m > speed 3
  else
    i = B00000111; // m > speed 2
else
  if(m > speed1)
    i = B00000011;  // m > speed 1
  else if(m > speed0)
    i = B00000001; // m > speed 0