首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么用位操作实现“/13”?一道笔试题

2012-03-14 
求助:如何用位操作实现“/13”?一道笔试题如题。谢谢了[解决办法]二进制:除以2相当于右移动一位除以13,可以把

求助:如何用位操作实现“/13”?一道笔试题
如题。谢谢了

[解决办法]
二进制:
除以2相当于右移动一位

除以13,可以把一个数转换成13进制,然后右移一位
再转换回去

如n
char sResult[max];
/*转换成13进制数据 */
int nTemp=n;
k=n/13;
for (i=0 to k-1)
do: sResult[i] = (char)(nTemp%13);
nTemp=nTemp/13;
end;
/* 移动一位,即除以13 */
for(i=0 to k-1)
do :
sResult[i]=sResult[i+1];
end;

/*转换成10进制 */
nTemp=(int)sResult[0]);
for(i=1 to k-2)
do:
nTemp=nTemp+(int)(sResult[i])*(exp(13,i));

end;
/*返回结果*/
return nTemp;
[解决办法]
这样应该算符合要求吧, 可能还可以化简很多 ....

#include <stdio.h>
#include <stdlib.h>

#ifdef _MSC_VER
typedef unsigned __int64 QW;
#else
typedef unsigned long long QW;
#endif
typedef unsigned long DW;

DWdiv13( DW __a )
{
QW r = 0 , QWA = __a , a , b ;
#define ADD1( a , b , r )r = (a&b) < <1; b ^= a; a = r;
#define ADD4( a , b , r )ADD1( a , b , r )ADD1( a , b , r )ADD1( a , b , r )ADD1( a , b , r )
#define ADD16( a , b , r )ADD4( a , b , r )ADD4( a , b , r )ADD4( a , b , r )ADD4( a , b , r )
#define ADD64( a , b , r )ADD16( a , b , r )ADD16( a , b , r )ADD16( a , b , r ) ADD16( a , b , r )
#define DIVROUND1( bit )a = r ; b = QWA < < bit ; ADD64( a , b , r ); r = b;
DIVROUND1( 30 )DIVROUND1( 27 )
DIVROUND1( 26 )DIVROUND1( 25 )
DIVROUND1( 23 )DIVROUND1( 22 )
DIVROUND1( 18 )DIVROUND1( 15 )
DIVROUND1( 14 )DIVROUND1( 13 )
DIVROUND1( 11 )DIVROUND1( 10 )
DIVROUND1( 06 )DIVROUND1( 03 )
DIVROUND1( 02 )DIVROUND1( 01 )
DIVROUND1( 00 )
return (DW)(r> > 34);
#undef ADD1
#undef ADD4
#undef ADD16
#undef ADD64
#undef DIVROUND1
}

int main()
{
int i;
for( i = 0; i < 10000; ++i )
{
DW x = rand() * rand();
if( div13( x ) != x / 13 )
printf( "error\n " );
}
return 0;
}


[解决办法]
169除以13的值为13,而169的二进制为10101001,13的二进制为1101
很难想象通过移位超作让10101001变成1101?
[解决办法]
想不出来,感觉至少还需要减法配合。
事实上,从汇编的角度看,你只要用到了if,while等需要条件判断的语句,那还是等价于用了减法。
----------------------------

正规的除法是用减法实现的,不过减法也不是不能由位操作实现,就是麻烦点。
针对这个特殊的除以13,13的2进制码是1101,补码是0011,
通过引入位变量来记载进位,完全可以实现用加补码方式获得商和余数的。
if什么的可以不用,也就是位与、位或、位异或、移位就可以实现了。就是麻烦。

其实汇编本身就有jc,jnc一类的判断语句,并不等价用减法,用这样的判断会简单点,不过还是很麻烦,不如用减法。

热点排行