-
Notifications
You must be signed in to change notification settings - Fork 1
/
37位运算.c
125 lines (81 loc) · 3.11 KB
/
37位运算.c
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
/*位运算*/
#include <stdio.h>
int main(){
/*
&与运算:对应两个二进位均为1时,结果位才为1,否则为0。(有假为假==0)
2&3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
& 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0010 --2
*/
/*
|或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0。(有真为真==1)
2|3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
| 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0011 --3
*/
/*
^ 异或运算:对应的二进位不同时为1,否则为0。(不同为真==1,相同为假==0)
2^3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
^ 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001 --1
注意:1.相同整数相^的结果是0.2.一个数^另一数两次结果不变3.整数相^跟顺序无关
2^2 2^3^3 3^2^3
010 010 011
010 011 010
--- --- ---
000 001 001
011 011
--- ---
010 010
*/
/*
~ 取反运算:对整数的各二进位进行取反,包括符号位(0变1,1变0,真假互换)
注意:取反是单目操作符 也就是只操作一个数
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
~ -----------------------------------------
1111 1111 1111 1111 1111 1111 1111 1101 --- -3 补码
1000 0000 0000 0000 0000 0000 0000 0011 --- -3 原码
1111 1111 1111 1111 1111 1111 1111 1100 ---- -3 反码
1.计算机里:补码==原码==反码(不是指表现形式相等,是指真实的值相等)
2.正数的补码,反码 , 原码的表现形式是一样的.
3.负数的补码=反码+1; 反码=原码符号位不变其余取反.
取反==原数的反值-1;// 2 :-2-1=-3 -3: 3-1=2
*/
/*
<< 左移:把整数的各二进位全部左移n位,高位丢弃(包括符号位),低位补0。
左移n位其实就是乘以2的n次方(但移动后符号位变化除外,符号位改变则正负改变)
3 <<1 -->6 ---> 3*2的1次方
3 <<2 -->12---> 3*2的2次方
3 <<3 -->24---> 3*2的3次方
0 0000 0000 0000 0000 0000 0000 0011000
1100 0000 0000 0000 0000 0000 0000 0000
*/
/*
>> 右移:把整数的各二进位全部右移n位,符号位不变。高位的空缺是正数补0;
是负数高位是补0或是补1 取决于编译系统的规定;右移n位其实就是除以2的n次方
3>>2 -->1 3/2的1次方=1
3>>2 -->0 3/2的2次方=0
0000 0000 0000 0000 0000 0000 0000 0011
000000 0000 0000 0000 0000 0000 0000 00
*/
/*
7*8=56 7<<3===7*2的3次方===7*8 111000
0111
1000
-----
0000
0000
0000
0111
---------
0111000
*/
printf("3>>2=%d\n",3.1>>2.1);
return 0;
}