C++ 位移

oceanapices 2012-02-16 09:50:42
最近看源代码 里面有好多位移的,请教下

uint8 i = 0;
uint8 c = 0;
uint8 cnt = 0;

int8 n[PHONE_SPACE_NUMBER_LEN];

if((len >> 1) > num_len)
{
*status = CMD_PARAM_ERROR;
return;
}

for(i = 0; i < len; i++)
{
c = (data[i] & 0x0f);

if((c > 9) && (c != 0x0f))
{
*status = CMD_PARAM_ERROR;
return;
}

if(c == 0x0f)
{
n[cnt++] = '\0';
break;
}

n[cnt++] = c + '0';

c = ((data[i] >> 4) & 0x0f);
if((c > 9) && (c != 0x0f))
{
*status = CMD_PARAM_ERROR;
return;
}

if(c == 0x0f)
{
n[cnt++] = '\0';
break;
}

n[cnt++] = c + '0';
}

for(i = 0; i < cnt; i++)
{
num[i] = n[i];
}
}


这个data数组里面是不超过15位的电话号码,
1:怎么len>>1 len值是8啊 数字怎么也位移?(第7行)
2为什么要判断这个: if((c > 9) && (c != 0x0f)).这C与9有什么关系?
...全文
413 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbzjzsb123 2012-02-17
  • 打赏
  • 举报
回复
代码风格不好,看不清楚
sl51314240 2012-02-17
  • 打赏
  • 举报
回复
除非用于异或,与,或操作,不然别位移,要除以4直接除,编译器会优化的
lirunfa 2012-02-16
  • 打赏
  • 举报
回复
对于二进制来说, 右移一位代表除以二,左移一位代表乘以二
nice_cxf 2012-02-16
  • 打赏
  • 举报
回复
代码的含义是8位的字符转化成数字串
每个字符代表2个数字,f为结束符,所以在9和f之间(不包括9和f)的是参数错
jackzhhuang 2012-02-16
  • 打赏
  • 举报
回复
>>n,指除以2的n次方
<<n,指乘以2的n次方

用位移代替直接乘除的目的是提高效率。
cddark 2012-02-16
  • 打赏
  • 举报
回复
c = (data[i] & 0x0f); / c = ((data[i] >> 4) & 0x0f);
if((c > 9) && (c != 0x0f))

取data[i]的低四位/高四位,如果大于9且不为f,退出。。。
shun_qizi_ran 2012-02-16
  • 打赏
  • 举报
回复
化成2进制数进行位操作,左移相当于乘2,右移相当于除2
把数字转化为字符,分别将0-15转化为字符0-9,A-F
面包大师 2012-02-16
  • 打赏
  • 举报
回复
2.
这个要看程序的作用,不然不好说。。。。c > 9。。。。简单的说就是判断c是否大于9.。。
面包大师 2012-02-16
  • 打赏
  • 举报
回复
1.数字也是可以位移的,len>>1就等价于len = len/2

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧