C++ 位移解决方案
C++ 位移
最近看源代码 里面有好多位移的,请教下
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有什么关系?
------解决方案--------------------
1.数字也是可以位移的,len>>1就等价于len = len/2
------解决方案--------------------
2.
这个要看程序的作用,不然不好说。。。。c > 9。。。。简单的说就是判断c是否大于9.。。
------解决方案--------------------
化成2进制数进行位操作,左移相当于乘2,右移相当于除2
把数字转化为字符,分别将0-15转化为字符0-9,A-F
------解决方案--------------------
c = (data[i] & 0x0f); / c = ((data[i] >> 4) & 0x0f);
if((c > 9) && (c != 0x0f))
取data[i]的低四位/高四位,如果大于9且不为f,退出。。。
------解决方案--------------------
>>n,指除以2的n次方
<<n,指乘以2的n次方
用位移代替直接乘除的目的是提高效率。
------解决方案--------------------
代码的含义是8位的字符转化成数字串
每个字符代表2个数字,f为结束符,所以在9和f之间(不包括9和f)的是参数错
------解决方案--------------------
对于二进制来说, 右移一位代表除以二,左移一位代表乘以二
------解决方案--------------------
除非用于异或,与,或操作,不然别位移,要除以4直接除,编译器会优化的
最近看源代码 里面有好多位移的,请教下
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有什么关系?
------解决方案--------------------
1.数字也是可以位移的,len>>1就等价于len = len/2
------解决方案--------------------
2.
这个要看程序的作用,不然不好说。。。。c > 9。。。。简单的说就是判断c是否大于9.。。
------解决方案--------------------
化成2进制数进行位操作,左移相当于乘2,右移相当于除2
把数字转化为字符,分别将0-15转化为字符0-9,A-F
------解决方案--------------------
c = (data[i] & 0x0f); / c = ((data[i] >> 4) & 0x0f);
if((c > 9) && (c != 0x0f))
取data[i]的低四位/高四位,如果大于9且不为f,退出。。。
------解决方案--------------------
>>n,指除以2的n次方
<<n,指乘以2的n次方
用位移代替直接乘除的目的是提高效率。
------解决方案--------------------
代码的含义是8位的字符转化成数字串
每个字符代表2个数字,f为结束符,所以在9和f之间(不包括9和f)的是参数错
------解决方案--------------------
对于二进制来说, 右移一位代表除以二,左移一位代表乘以二
------解决方案--------------------
除非用于异或,与,或操作,不然别位移,要除以4直接除,编译器会优化的