在C语言中,如何将几个布尔值转换为int值,其位值是不同测试的结果
我想将几个测试转换为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 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