不用除法实现%13操作(位操作)

  今天上自习了,过几天就要考试软件工程了,但是把它复习一偏后就没有心思上自习了,效率明显的降低了,我一般对待这种事情的方式是及时终止,背着书包就回寝室了.

 想起前几天在csdn上看的用位操作实现%13的操作,现在恰好在水木上看了一个类似的问题,有个算法,实现简单,有能够满足要求.

描叙:

 N= ( 8*x + y)  

其中 x = N >> 3 , y = N &ox7 (我想要理解这个并不难,自己好好想吧)

  N % 7 = ( 8 * x + y ) % 7 = (7 * x + x + y) % 7 = x + y

不断的迭代,知道 (x +y) <  N 为止

%13 也是同样的道理:

 

 #include " stdio.h "
#include
" stdlib.h "
#define  BITMOD  0xF
#define  BIT  4
#define  MOD 13
int  main()
{
 
int  sNumber; 
 
int  temp,temp1 ;
 
int  result[ 100 ];
 
int  len  =   0  ;
 printf(
" please input the source number: " );
 scanf(
" %d " , & sNumber);
 temp 
=  sNumber ;
 temp1 
=  sNumber ;
 
while  ( sNumber  >  MOD )
 {
  temp 
=  sNumber  &  BITMOD ;
  temp 
+=   3   *  ( sNumber  >>  BIT); 
  sNumber 
=  temp ; 
 }
 
if  ( temp  ==  MOD) temp  =   0  ;
 printf(
" the number %d mod %d is : %d " ,temp1 ,MOD, temp);
 
return   0  ;
}


运行及结果:

please input the source number:70
the number 70 mod 13 is : 5

随便帖俩段代码:

一段是不用循环,实现一个无符号整数的个为交换的程序:

unsigned   bit_reverse( unsigned  int  n)

{

       n 
=  ((n  >>   1 &   0x55555555 |  ((n  <<   1 &   0xaaaaaaaa );

       n 
=  ((n  >>   2 &   0x33333333 |  ((n  <<   2 &   0xcccccccc );

       n 
=  ((n  >>   4 &   0x0f0f0f0f |  ((n  <<   4 &   0xf0f0f0f0 );

       n 
=  ((n  >>   8 &   0x00ff00ff |  ((n  <<   8 &   0xff00ff00 );

       n 
=  ((n  >>   16 &   0x0000ffff |  ((n  <<   16 &   0xffff0000 );
       
     
return  n ;

}

 

一段是实现统计一个无符号整数总公包含的1的位数:

 

 unsigned  int   count_ones(unsigned  int  n)

{

       n 
=  (n  &   0x55555555 +  ((n  &   0xaaaaaaaa >>   1 );

       n 
=  (n  &   0x33333333 +  ((n  &   0xcccccccc >>   2 );

       n 
=  (n  &   0x0f0f0f0f +  ((n  &   0xf0f0f0f0 >>   4 );

       n 
=  (n  &   0x00ff00ff +  ((n  &   0xff00ff00 >>   8 );

       n 
=  (n  &   0x0000ffff +  ((n  &   0xffff0000 >>   16 );

    
return  n ;
 }

 

自己好好分析一下他们是怎么实现的把

这也是个思想

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值