Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1520603
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-08-19 17:47:36

//注意,对于int 型, 左移没事,右移注意符号位,应改为unsigned int 
int add(int a,int b)
{
 int c;            
 while(c=a&b) //保留当前要进位的位, 为0表示无进位
 {
  a = a^b;   //异或是无进位的加法
  b=c<<1;       //左移相当于进位
 }
 return a^b;   //无进位则异或等同于加法
}
int mul(int a,int b)
{
 int c, i;
 c= 0;     //累加器
 for( i =0; i<32 ;i++)
 {
   if(b&(1<   c = add(c , a << i)
 }
}
int minus(int a, int b)
{
 return add(a,-b);
}
//循环移n位 a = (a<>32-n)  注意是逻辑右移
unsigned int int_div(unsigned int  a ,unsigned  int b)
{
  int i;
  unsigned int m=0;
  for(i=1;i<=32; i=add(i,1))    // i++也用到了加法呢
  {
   m =  m<<1 |  a>>31;      //把a左移进m直到 m >= b, 则可商1
   a = a<<1;
   if( m >= b)
   {
    m = minus(m,b);
    a = add(a , 1);
   }
  }
  return a;
}
阅读(1312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~