1 / 7
文档名称:

移位运算.doc

格式:doc   大小:16KB   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

移位运算.doc

上传人:wz_198614 2017/8/22 文件大小:16 KB

下载得到文件列表

移位运算.doc

文档介绍

文档介绍:移位运算
用位运算实现加减乘除
int j=i<<2;//左移2位之后,变成0000 0000 0000 1000 ,j等于4,相当于i乘以2^2.
需要注意的是要避免溢出,如unsigned int类型的最大值为2^16减1,当移位之后的值超过此值时,就会发生溢出。
右移与左移类似。
现在遇到一个问题,那就是如果我想乘以一个10怎么办?10的二进制是0000 0000 0000 1010 可以这样做:int i=2; j=i<<3+i<<1
可是如果乘数是个变量,我们怎么用代码来实现呢?我猜想光靠简单的移位和加减操作恐怕很难完成。于是网上搜了一下,找到一份代码,我简单的测试了一下,没有问题,是通过位运算来实现的,如&,|,~,^......... 代码如下:
#include "iostream"
using namespace std;
// Bit Operation Implements Add, Submit, Multiply, Divide
// Use only Integer with little length
// add
int add( int a, int b ){
int c;
while( c = (a&b) ){
a = (a^b);
b = (c<<1);
}
return (a^b);
}
// complementary code
int rev( int a ){
return add((~a), 1);
}
// is positive
int ispos( int a ){
return (a&0xFFFF) && !(a&0x8000);
}
// is negative
int isneg( int a ){
return a&0x8000;
}
// is 0
int iszero( int a ){
return !(a&0xFFFF);
}
// if or not have a > b >= 0 int isbig_pos( int a, int b ){ int c = 1;
b = (a^b);
if( iszero(b) ) return 0;
while( b >>= 1 ){
c <<= 1;
}
return (c&a);
}
// if or not have a > b
int isbig( int a, int b ){
if( isneg(a) ){
if( isneg(b) ){
return isbig_pos( rev(b), rev(a) ); }
return 0;
}
if( isneg(b) ) return 1;
return isbig_pos(a, b);
}
// submit
int sub( int a, int b ){
return add(a, rev(b));