byte h,l,dot,byteR0, byteG0;
h = 1;
l = 0;
byteR0 = 0xAF;
byteG0 = 0x35;for(dot=8;dot!=0 ;dot-=1)  
{
if(byteR0 & 0x80)
R0 = h;
else
R0 = l; if(byteG0 & 0x80)
G0 = h;
else
G0 = l;
byteR0 <<= 1;  
byteG0 <<= 1;
}这段代码的目的是把一个Byte中串行按bit传输出去。其中R0和G0是一个宏,用于给某个bit赋值,这个bit是用位域定义出来的。
h,l是全局变量,值只可能是0或者1,但编译期无法确定是0还是1。优化目的:尽可能的减少运行时间,可以增加代码量,但不能增加内存使用量。

解决方案 »

  1.   

    1,我已经说了,h和l是全局变量,并不是常量,我在这里给它赋值,只是一个示意。
    2,变量byteR0 和byteG0 的值,也是根据传入的数据赋值的,不是常量。
    请真正有热心的网友进来讨论,看帖不仔细的就不用麻烦了
      

  2.   


    byte h,l,dot,byteR0, byteG0; 
    h = 1; 
    l = 0; 
    byteR0 = 0xAF; 
    byteG0 = 0x35; dot = 0x80;
    while(dot) {
      R0 = (byteR0 & dot)?h:l;
      G0 = (byteG0 & dot)?h:l; 
      dot >>= 1;

    优化一下,不知何不何LZ意
    给分 千万别客气
      

  3.   

    if(byteR0 & 0x80) 
    R0 = h; 
    else 
    R0 = l; table[0x81]talbe[0x80] = h;
    talbe[0x40] = h;
    talbe[0x20] = h;
    talbe[0x10] = h;
    talbe[0x08] = h;
    talbe[0x04] = h;
    talbe[0x02] = h;
    talbe[0x01] = h;
    talbe[0]    = l;
    展开 不要用if啊
    R0 = talbe[byteR0 & 0x80]
    G0 = talbe[byteG0 & 0x80]
    R0 = talbe[byteR0 & 0x40]
    G0 = talbe[byteG0 & 0x40]
    R0 = talbe[byteR0 & 0x20]
    G0 = talbe[byteG0 & 0x20]
    R0 = talbe[byteR0 & 0x10]
    G0 = talbe[byteG0 & 0x10]
    R0 = talbe[byteR0 & 0x08]
    G0 = talbe[byteG0 & 0x08]
    R0 = talbe[byteR0 & 0x04]
    G0 = talbe[byteG0 & 0x04]
    R0 = talbe[byteR0 & 0x02]
    G0 = talbe[byteG0 & 0x02]
    R0 = talbe[byteR0 & 0x01]
    G0 = talbe[byteG0 & 0x01]
      

  4.   

    R0 = (byteR0 & dot)?h:l;
    -----------------------
    是否也相当于:
    if(byteR0 & dot)
        R0 = h;
    else
        R0 = l;减少了一个位移,这确实是真的,呵呵
      

  5.   

    你的代码我已经应用到设备中,过几天测试效果。不过效果是无法量化的,只能靠肉眼观察,估计肉眼看不出来变化^_^。另外,大家可以在变量h和l上再想想办法,虽然这2个变量的值,在运行期是不确定的,但它们的取值范围只会是0或者1。如果能把中间的if省掉,将会减少不少cpu周期
      

  6.   

    将1楼的代码整理如下:
    byte dot;
    for(dot=8;dot!=0 ;dot-=1)  

      if(byteR0 & 0x80) 
        R0 = h; 
      else 
        R0 = l;   if(byteG0 & 0x80) 
        G0 = h; 
      else 
        G0 = l; 
      byteR0 <<= 1;  
      byteG0 <<= 1; 
    强调:h、l、byteR0,byteG0均是byte类型的全局变量,由其它地方赋值。
    h和l的值只会是0或者1,并且当h==0时,l必定等于1,当h==1时,l必定等于0
    目前优化后的代码为:(尚未经过验证)byte dot = 0x80;
    while(dot)  

      if(byteR0 & dot) 
        R0 = h; 
      else 
        R0 = l;   if(byteG0 & dot) 
        G0 = h; 
      else 
        G0 = l;   
      dot >>= 1; 

      

  7.   

    不用table 展开也比循环快