我是靠谱客的博主 热情大雁,这篇文章主要介绍位运算加减乘除,现在分享给大家,希望可以做个参考。

转自:http://blog.csdn.net/hackbuteer1/article/details/7390093
转自:http://www.cnblogs.com/dandingyy/archive/2012/10/29/2745570.html

^: 按位异或;&:按位与; | :按位或

计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理。

对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负。

原码 -> 补码: 数值位取反加1

补码 -> 原码: 对该补码的数值位继续 取反加1

补码 的绝对值(称为真值):正数的真值就是本身,负数的真值是各位(包括符号位)取反加1(即变成原码并把符号位取反).

b -> -b : 各位(包括符号位)取反加1

加法运算:将一个整数用二进制表示,其加法运算就是:相异(^)时,本位为1,进位为0;同为1时本位为0,进位为1;同为0时,本位进位均为0.

所以,不计进位的和为sum = a^b,进位就是arr = a&b,(与sum相加时先左移一位,因为这是进位)。完成加法直到进位为0.

减法运算:a-b = a+(-b)  根据补码的特性,各位取反加1即可(注意得到的是相反数,不是该数的补码,因为符号位改变了)

(上面用二进制实现的加减法可以直接应用于负数)

乘法运算:原理上还是通过加法计算。将b个a相加,注意下面实际的代码。

除法运算:除法运算是乘法的逆。看a最多能减去多少个b,

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<iostream> #include<cstdlib> using namespace std; //递归版本的加法实现 int Add(int a, int b) { return b ? Add(a^b, (a&b)<<1) : a; /* if(b) return plus_rec(a^b, (a&b)<<1); else return a; */ } //该为迭代版本 int Add_iter(int a, int b) { int ans; while(b) { ans = a^b; b = (a&b)<<1; a = ans; } return ans; } //求a的相反数:将各位取反加一 int negative(int a) //get -a { return Add(~a, 1); } int Minus(int a, int b) { return Add(a, negative(b)); } //正数乘法 int Multi(int a, int b) { int ans = 0; while(b) { if(b&1) ans = Add(ans, a); a = a << 1; b = b >> 1; } return ans; } //正数除法 int Divide(int a, int b) { int coun = 0; while(a >= b) { a = Minus(a, b); coun = Add(coun, 1); } return coun; } //判断是否是负数,0,正数 int isneg(int a) { return a & 0x8000; } int iszero(int a) { return !(a & 0xFFFF); } int ispos(int a) { return (a&0xFFFF) && !(a&0x8000); } //处理负数的乘法和除法 int My_Multi(int a, int b) { if(iszero(a) || iszero(b)) return 0; if(isneg(a)) { if(isneg(b)) return Multi(negative(a), negative(b)); else return negative(Multi(negative(a), b)); }else if(isneg(b)) return negative(Multi(a, negative(b))); else return Multi(a, b); } int My_Divide(int a, int b) { if(iszero(b)) { cout << "Error!" << endl; exit(1); } if(iszero(a)) return 0; if(isneg(a)) { if(isneg(b)) return Divide(negative(a), negative(b)); else return negative(Divide(negative(a), b)); }else if(isneg(b)) return negative(Divide(a, negative(b))); else return Divide(a, b); } int main(int argc, char **argv) { int a = 5; int aa = -5; int b = 3; int bb = -3; int c = 15; cout << Add(a, b) << endl; cout << Add(a, bb) << endl; cout << Minus(a, b) << endl; cout << Minus(b, a) << endl; cout << Multi(a, b) << endl; cout << My_Multi(aa, b) << endl; cout << Divide(c, a) << endl; return 0; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// 加减乘除位运算 // 程序中实现了比较大小、加减乘除运算。所有运算都用位操作实现 // 在实现除法运算时,用了从高位到低位的减法 // 具体如下,算法也比较简单,所以没有作注释 #include<iostream> #include<cstdio> using namespace std; int Add(int a, int b) { int ans; while(b) { //直到没有进位 ans = a^b; //不带进位加法 b = ((a&b)<<1); //进位 a = ans; } return a; } //这个和加法一样了,首先取减数的补码,然后相加。 int negtive(int a) //取补码 { return Add(~a, 1); } int Sub(int a, int b) { return Add(a, negtive(b)); } // 判断正负 int ispos( int a ) { //正 return (a&0xFFFF) && !(a&0x8000); } int isneg( int a ) { //负 return a&0x8000; } int iszero( int a ) { //0 return !(a&0xFFFF); } //正数乘法运算 int Pos_Multiply(int a,int b) { int ans = 0; while(b) { if(b&1) ans = Add(ans, a); a = (a<<1); b = (b>>1); } return ans; } //乘法运算 int Multiply(int a,int b) { if( iszero(a) || iszero(b) ) return 0; if( ispos(a) && ispos(b) ) return Pos_Multiply(a, b); if( isneg(a) ) { if( isneg(b) ) { return Pos_Multiply( negtive(a), negtive(b) ); } return negtive( Pos_Multiply( negtive(a), b ) ); } return negtive( Pos_Multiply(a, negtive(b)) ); } //除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。 int Pos_Div(int x,int y) { int ans=0; for(int i=31;i>=0;i--) { //比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出 if((x>>i)>=y) { ans+=(1<<i); x-=(y<<i); } } return ans; } //除法运算 int MyDiv( int a, int b ) { if( iszero(b) ) { cout << "Error" << endl; exit(1); } if( iszero(a) ) return 0; if( ispos(a) ) { if( ispos(b) ) return Pos_Div(a, b); return negtive( Pos_Div( a, negtive(b)) ); } if( ispos(b) ) return negtive( Pos_Div( negtive(a), b ) ); return Pos_Div( negtive(a), negtive(b) ); } // 比较两个正数的大小(非负也可) int isbig_pos( int a, int b ) { //a>b>0 int c = 1; b = (a^b); if( iszero(b) ) return 0; while( b >>= 1 ) { c <<= 1; } return (c&a); } // 比较两个数的大小 int isbig( int a, int b ) { //a>b if( isneg(a) ) { if( isneg(b) ) { return isbig_pos( negtive(b), negtive(a) ); } return 0; } if( isneg(b) ) return 1; return isbig_pos(a, b); }

最后

以上就是热情大雁最近收集整理的关于位运算加减乘除的全部内容,更多相关位运算加减乘除内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部