今天上自习了,过几天就要考试软件工程了,但是把它复习一偏后就没有心思上自习了,效率明显的降低了,我一般对待这种事情的方式是及时终止,背着书包就回寝室了.
想起前几天在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 ;
}
#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 ;
}
{
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 ;
}
{
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 ;
}
自己好好分析一下他们是怎么实现的把
这也是个思想