uvision4中char型数据的左移右移操作是怎么回事儿?

时间:2022-03-15 06:48:08
for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop(); 
      }
这个时候是不是先把这个char型的数据转换成了16进制的0x0000.然后再移动的?

8 个解决方案

#1


为毛要转成十六进制呢,BitCnt=0;BitCnt<8;BitCnt++,又没溢出.
因为不是循环移位的,所以retc连初始化都不需要

#2


直接左移的,不过不同的处理器之间应该有点细微的差异

#3


引用 1 楼 wangfan027 的回复:
为毛要转成十六进制呢,BitCnt=0;BitCnt<8;BitCnt++,又没溢出.
因为不是循环移位的,所以retc连初始化都不需要
 把一个char型的变量左移是什么样的效果?

#4


引用 2 楼 richyhuang 的回复:
直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?

#5


unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
  
  retc=0; 
  SDA=1;                       /*置数据线为输入方式,就像I/O口一样先置了高电平能才检测*/  
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop(); 
      }
  SCL=0;    
  _Nop();
  _Nop();
  return(retc);
}

/********************************************************************
                     应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/

//值得注意的是这里是主控器发出来的信号。
void Ack_I2c(bit a)
{
  
  if(a==0)SDA=0;              /*在此发出应答或非应答信号 */
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();                    /*时钟高电平周期大于4μs*/
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
  _Nop();
  _Nop();    
}

#6


引用 4 楼 yconnor 的回复:
Quote: 引用 2 楼 richyhuang 的回复:

直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?


不是,是当前字节

#7


引用 4 楼 yconnor 的回复:
Quote: 引用 2 楼 richyhuang 的回复:

直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?

比如0x0f,左移1位后就是0x1e

#8



左移就是x2,右移就是/2。

0010<<1 ---> 0100
0010>>1 ---> 0001

#1


为毛要转成十六进制呢,BitCnt=0;BitCnt<8;BitCnt++,又没溢出.
因为不是循环移位的,所以retc连初始化都不需要

#2


直接左移的,不过不同的处理器之间应该有点细微的差异

#3


引用 1 楼 wangfan027 的回复:
为毛要转成十六进制呢,BitCnt=0;BitCnt<8;BitCnt++,又没溢出.
因为不是循环移位的,所以retc连初始化都不需要
 把一个char型的变量左移是什么样的效果?

#4


引用 2 楼 richyhuang 的回复:
直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?

#5


unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
  
  retc=0; 
  SDA=1;                       /*置数据线为输入方式,就像I/O口一样先置了高电平能才检测*/  
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop(); 
      }
  SCL=0;    
  _Nop();
  _Nop();
  return(retc);
}

/********************************************************************
                     应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/

//值得注意的是这里是主控器发出来的信号。
void Ack_I2c(bit a)
{
  
  if(a==0)SDA=0;              /*在此发出应答或非应答信号 */
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();                    /*时钟高电平周期大于4μs*/
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
  _Nop();
  _Nop();    
}

#6


引用 4 楼 yconnor 的回复:
Quote: 引用 2 楼 richyhuang 的回复:

直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?


不是,是当前字节

#7


引用 4 楼 yconnor 的回复:
Quote: 引用 2 楼 richyhuang 的回复:

直接左移的,不过不同的处理器之间应该有点细微的差异

 直接左移是指向了他的下一个字符么?

比如0x0f,左移1位后就是0x1e

#8



左移就是x2,右移就是/2。

0010<<1 ---> 0100
0010>>1 ---> 0001