简简单单学会C#位运算
简简单单学会C#位运算
一、理解位运算
要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作
二、理解数字进制
上面提到了二进制,除了二进制,我们还有很多的进制,下面列举一些常见的进制
10进制数:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 (每位满10进1,同时低位补0)
2进制数:00000,00001,00010,00011,00100,00101,00110,00111,01000,01001,01010,01011,01100,01101,01110,01111,10000,10001,10010,10011,10100 (每位满2进1,同时低位补0)
8进制数:00,01,02,03,04,05,06,07,10,11,12,13,14,15,16,17,20,21,22,23,24 (每位满8进1,同时低位补0)
16进制数:0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14 (每位满16进1,10~15由A~F字母表示,同时低位补0)
2进制、8进制、16进制、32进制、64进制等转换成10进制计算方法我得出一个公式:(^表示次方,如:2^2,即2的2次方,8^5即8的5次方)
每位数字转换成10进制时=进制数^(次方)数字索引位(从0开始计算)*数字
计算示例:(注意黑粗体字)
2进制数:10100=2^0*0+2^1*0+2^2*1+2^3*0+2^4*1=0+0+4+0+16=20
8进制数:24=8^0*4+8^1*2=4+16=20
16进制数:0x14(注意0x是用来表示16进制数的意思,不是数字本身的内容)=16^0*4+16^1*1=4+16=20
至于各进制之间的转换,比如:2进制转换成16进制,如果想自己手算,一般都是先转成10进制,然后将数字进行与进制数相除,直到得出余数小于或等于进制数(或0),当然作为程序员的我们,应该使用现有的方法,如下:
Convert.ToString(数字,进制数)
如:Convert.ToString(10,2)=01010,Convert.ToString(10,8)=12 ,Convert.ToString(13,16)=0x0d
综合示例如下:
1
2
3
4
5
6
7
8
9
10
|
int i10 = 68; int i16 = 0x2A; Console.WriteLine( "示例一:" ); Console.Write( "10进制【68】转成2、8、16进制结果:{0}、{1}、{2}\n" , Convert.ToString(i10, 2), Convert.ToString(i10, 8), Convert.ToString(i10, 16)); Console.Write( "16进制【0x2A】转成2、8、10进制结果:{0}、{1}、{2}\n" , Convert.ToString(i16, 2), Convert.ToString(i16, 8), Convert.ToString(i16, 10)); |
输出结果:
10进制【68】转成2、8、16进制结果:1000100、104、44
16进制【0x2A】转成2、8、10进制结果:101010、52、42
三、初识位运算(位与与位或运算)
本文一开始就说明了,位运算就是二进制每位数字的运算操作,下面通过代码示例来初识位运算
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
|
Console.WriteLine( "示例二:" ); int b0 = 0, b1 = 1, b2 = 2, b3 = 4, b4 = 8, b5 = 16; FormatWrite( "b0" , "b1" , b0, b1, "&" ); FormatWrite( "b0" , "b1" , b0, b1, "|" ); Console.WriteLine(); FormatWrite( "b2" , "b3" , b2, b3, "&" ); FormatWrite( "b2" , "b3" , b2, b3, "|" ); Console.WriteLine(); FormatWrite( "b4" , "b5" , b4, b5, "&" ); FormatWrite( "b4" , "b5" , b4, b5, "|" ); static void FormatWrite( string n1, string n2, int d1, int d2, string opt) { string writeMsg = string .Format( "{0} {1} {2}" , n1, opt, n2); writeMsg += string .Format( " = {0} {1} {2}" , d1, opt, d2); string d1str = Convert.ToString(d1, 2), d2str = Convert.ToString(d2, 2); int maxLen = Math.Max(d1str.Length, d2str.Length); writeMsg += string .Format( " = {0} {1} {2}" , d1str.PadLeft(maxLen, '0' ), opt, d2str.PadLeft(maxLen, '0' )); switch (opt) { case "&" : { writeMsg += string .Format( " = 10进制:{0} 或 2进制:{1}" , Convert.ToString(d1 & d2, 10), Convert.ToString(d1 & d2, 2).PadLeft(maxLen, '0' )); break ; } case "|" : { writeMsg += string .Format( " = 10进制:{0} 或 2进制:{1}" , Convert.ToString(d1 | d2, 10), Convert.ToString(d1 | d2, 2).PadLeft(maxLen, '0' )); break ; } } Console.WriteLine(writeMsg); } |
输出结果:
b0 & b1 = 0 & 1 = 0 & 1 = 10进制:0 或 2进制:0
b0 | b1 = 0 | 1 = 0 | 1 = 10进制:1 或 2进制:1
b2 & b3 = 2 & 4 = 010 & 100 = 10进制:0 或 2进制:000
b2 | b3 = 2 | 4 = 010 | 100 = 10进制:6 或 2进制:110
b4 & b5 = 8 & 16 = 01000 & 10000 = 10进制:0 或 2进制:00000
b4 | b5 = 8 | 16 = 01000 | 10000 = 10进制:24 或 2进制:11000
位与运算:
参加运算的两个数字,按二进制进行与运算,如果两个相应的二进位数为1,则该位的结果为 1, 否则为 0 ,即:
0 & 0 = 0;0 & 1 = 0;1 & 0 = 0;1& 1 = 1
也就是只有1 & 1才会得1,否则都为0;
位或运算:
参加运算的两个数字,按二进制进行或运算,如果两个相应的二进位中只要有一个为 1,则该位的结果就为 1,否则为 0 ,即:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
也就是只有0 & 0才会得0,否则都为1;
四、寻找规律
我们先看一下10进制及2进制0~20的数字
10进制数:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
2进制数:00000,00001,00010,00011,00100,00101,00110,00111,01000,01001,01010,01011,01100,01101,01110,01111,10000,10001,10010,10011,10100
从2进制数0~20中,我们发现只要是2的偶数次方时,则位数发生变化,且多位中只有一个为1,其余位均为0,找出的数字如下:
00000、00001、00010、,00100、01000、10000
对应10进制数:0、1、2、4、8、16
如果对这些数全部进行位或运算,则最终的结果是:11111,即5位会部是1
从这里发现了什么呢?我是看出来了,不知道各位看官是否看出规律,其实很简单,如果我们把每一位都当成一个控制开关或者说是存在不存在,那么0表示关或者不存在,1表示开或者存在,那么我们可以针对这个规律实现复杂的组合控制。
其实微软早就应用了这个规律特性,比如:
typeof(Program).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
BindingFlags定义如下:
如上,每一个枚举项都是2的次方,每一项都是上一项的2倍,我们也可以利用这个规律实现类似的处理。
五、实现组合控制
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
|
Console.WriteLine( "示例四:" ); ButtonStyle userbtnStyle = ButtonStyle.OK | ButtonStyle.Cancel | ButtonStyle.Alert | ButtonStyle.Info; //用户需要显示的ButtonStyle,通过或运算组合在一起,得出2进制值:1111 string buttonStyleStr = null ; //进行位逻辑判断,能够准确识别userbtnStyle的组合的内容 if ((userbtnStyle & ButtonStyle.AlertInfo) == ButtonStyle.AlertInfo) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.AlertInfo); } else if ((userbtnStyle & ButtonStyle.Alert) == ButtonStyle.Alert) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Alert); } else if ((userbtnStyle & ButtonStyle.Info) == ButtonStyle.Info) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Info); } if ((userbtnStyle & ButtonStyle.OKCancel) == ButtonStyle.OKCancel) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.OKCancel); } else if ((userbtnStyle & ButtonStyle.OK) == ButtonStyle.OK) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.OK); } else if ((userbtnStyle & ButtonStyle.Cancel) == ButtonStyle.Cancel) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Cancel); } Console.WriteLine( "需要显示的按钮有:" + buttonStyleStr.Substring(1)); enum ButtonStyle { None = 0x00, OK = 0x01, Cancel = 0x02, Alert = 0x04, Info = 0x08, OKCancel = 0x01 | 0x02, AlertInfo = 0x04 | 0x08 } |
输出结果:
需要显示的按钮有:AlertInfo+OKCancel
如果改变userbtnStyle的组合,得到的结果也会不同
另外一个示例:
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
|
Console.WriteLine( "示例五:" ); AllowType userPermission = AllowType.Add | AllowType.Update | AllowType.Upload | AllowType.Download | AllowType.Select; string userPermissionStr = null ; if ((userPermission & AllowType.Edit) == AllowType.Edit) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Edit); } else { if ((userPermission & AllowType.Add) == AllowType.Add) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Add); } if ((userPermission & AllowType.Update) == AllowType.Update) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Update); } if ((userPermission & AllowType.Delete) == AllowType.Delete) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Delete); } if ((userPermission & AllowType.Upload) == AllowType.Upload) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Upload); } } if ((userPermission & AllowType.Read) == AllowType.Read) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Read); } else { if ((userPermission & AllowType.Select) == AllowType.Select) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Select); } if ((userPermission & AllowType.Download) == AllowType.Download) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Download); } } Console.WriteLine( "用户具备的权限有:" + userPermissionStr.Substring(1)); enum AllowType { None = 0, Add = 1, Update = 2, Delete = 4, Select = 8, Upload = 16, Download = 32, Edit = Add | Update | Delete | Upload, Read = Select | Download } |
输出结果:
用户具备的权限有:Add+Update+Upload+Read
如果改变userPermission的组合,得到的结果也会不同
上述两个例子,就是允分利用位或位与运算,大家可以理解位或是将两者拼在一起,位与是找出组合中是否有包含的部份
六、了解其它位运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Console.WriteLine( "示例六:" ); int x1 = 108; Console.Write( "~位非运算:{0} -->> {1} ; {2} -->> {3}\n" , Convert.ToString(x1, 10), Convert.ToString(~x1, 10), Convert.ToString(x1, 2), Convert.ToString(~x1, 2)); Console.Write( "<<位左移(移5位)运算:{0} -->> {1} ; {2} -->> {3}\n" , //说白了讲:左移N位就是将二进制数后面补N位0 Convert.ToString(x1, 10), Convert.ToString(x1 << 5, 10), Convert.ToString(x1, 2), Convert.ToString(x1 << 5, 2)); Console.Write( ">>位右移(移5位)运算:{0} -->> {1} ; {2} -->> {3}\n" , //说白了讲:右移N位就是将二进制数后面删除N位数(不论0或1) Convert.ToString(x1, 10), Convert.ToString(x1 >> 5, 10), Convert.ToString(x1, 2), Convert.ToString(x1 >> 5, 2)); Console.Write( "^位异或(异或5)运算:{0} ^ {1} -->> {2} ; {3} ^ {4}-->> {5}\n" , Convert.ToString(x1, 10),Convert.ToString(5, 10), Convert.ToString(x1 ^ 5, 10), Convert.ToString(x1, 2), Convert.ToString(5, 2), Convert.ToString(x1 ^ 5, 2)); |
输出结果:
~位非运算:108 -->> -109 ; 1101100 -->> 11111111111111111111111110010011
<<位左移(移5位)运算:108 -->> 3456 ; 1101100 -->> 110110000000
>>位右移(移5位)运算:108 -->> 3 ; 1101100 -->> 11
^位异或(异或5)运算:108 ^ 5 -->> 105 ; 1101100 ^ 101-->> 1101001
~非运算:是一个单项运算符,用来对一个二进制按位取反,即将 0 变 1,1变 0。
<<左移:用来对一个数每个二进位全部左移若干位,说白了讲:左移N位就是将二进制数后面补N位0
>>右移:用来对一个数每个二进位全部右移若干位,移到右端的低位被舍弃,对无符号数,高位补 0,说白了讲:右移N位就是将二进制数后面删除N位数(不论0或1)
^异或运算: 也称 XOR 运算符。它的规则是若参加运算的两个二进位同号,则结果为0,异号则为1。即 0^0=0; 0^1=1; 1^0=1;1^1=0;说白了讲:若两个都为0,则为0,否则相同的则为0,不相同的则为1
小技巧说明:
大家在定义枚举时,除了0,1外,其余项只需要确保每一项乘以2得出下一项的值即可,如10进制数的值:0,1,2,4,8,16,32,64,128,256,16进制数的值:0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
通过10进制数的值与16进制数的值的对比发现,采用16进制定义枚举值更好,因为我们可以很快速的定义出我们需要的值(都是按照:0,1,2,4,8循环,只是位数上升而矣),比如:
0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x100,0x200,0x400,0x800,0x1000
对应的10进制数:0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096
明显16进制定义值相对简单一些,我们无需进行*2的计算,当然大家随意选择。
为了便于大家进行各种测试,贴出DEMO代码,供大家学习:
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace TestConsoleApp { class Program { static void Main( string [] args) { Console.SetBufferSize(800, 600); Console.WriteLine( "数据进制了解:" ); int [] nums = new [] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; Console.WriteLine( "10进制数:" + string .Join( "," , nums)); Console.WriteLine( "2进制数:" + GetFormatNumbersToStr(Convert.ToString, 2, true , nums)); Console.WriteLine( "8进制数:" + GetFormatNumbersToStr(Convert.ToString, 8, true , nums)); Console.WriteLine( "16进制数:" + GetFormatNumbersToStr(Convert.ToString, 16, true , nums)); Console.WriteLine(); int i10 = 68; //10进制数:68 int i16 = 0x2A; //16进制=16^0*10+16^1*2=10+32=42 -->相当于10进制数:42 Console.WriteLine( "示例一:" ); Console.Write( "10进制【68】转成2、8、16进制结果:{0}、{1}、{2}\n" , Convert.ToString(i10, 2), Convert.ToString(i10, 8), Convert.ToString(i10, 16)); Console.Write( "16进制【0x2A】转成2、8、10进制结果:{0}、{1}、{2}\n" , Convert.ToString(i16, 2), Convert.ToString(i16, 8), Convert.ToString(i16, 10)); Console.WriteLine(); Console.WriteLine( "示例二:" ); int b0 = 0, b1 = 1, b2 = 2, b3 = 4, b4 = 8, b5 = 16; FormatWrite( "b0" , "b1" , b0, b1, "&" ); FormatWrite( "b0" , "b1" , b0, b1, "|" ); Console.WriteLine(); FormatWrite( "b2" , "b3" , b2, b3, "&" ); FormatWrite( "b2" , "b3" , b2, b3, "|" ); Console.WriteLine(); FormatWrite( "b4" , "b5" , b4, b5, "&" ); FormatWrite( "b4" , "b5" , b4, b5, "|" ); FormatWrite( "0~" , "~16" , 0 | 1 | 2 | 4, 8|16, "|" ); Console.WriteLine(); Console.WriteLine( "示例三:" ); List< int > dds = new List< int >(); int d = 0; while (d <= 500) { if (d < 2) { dds.Add(d); ++d; } else { dds.Add(d); d = d * 2; } } Console.WriteLine( "10进制数:" + GetFormatNumbersToStr(Convert.ToString, 10, true , dds.ToArray())); Console.WriteLine( "16进制数:" + GetFormatNumbersToStr(Convert.ToString, 16, true , dds.ToArray())); Console.WriteLine( "2进制数:" + GetFormatNumbersToStr(Convert.ToString, 2, true , dds.ToArray())); Console.WriteLine(); Console.WriteLine( "示例四:" ); ButtonStyle userbtnStyle = ButtonStyle.OK | ButtonStyle.Cancel | ButtonStyle.Alert | ButtonStyle.Info; //用户需要显示的ButtonStyle,通过或运算组合在一起,得出2进制值:1111 string buttonStyleStr = null ; //进行位逻辑判断,能够准确识别userbtnStyle的组合的内容 if ((userbtnStyle & ButtonStyle.AlertInfo) == ButtonStyle.AlertInfo) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.AlertInfo); } else if ((userbtnStyle & ButtonStyle.Alert) == ButtonStyle.Alert) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Alert); } else if ((userbtnStyle & ButtonStyle.Info) == ButtonStyle.Info) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Info); } if ((userbtnStyle & ButtonStyle.OKCancel) == ButtonStyle.OKCancel) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.OKCancel); } else if ((userbtnStyle & ButtonStyle.OK) == ButtonStyle.OK) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.OK); } else if ((userbtnStyle & ButtonStyle.Cancel) == ButtonStyle.Cancel) { buttonStyleStr += "+" + Enum.GetName( typeof (ButtonStyle), ButtonStyle.Cancel); } Console.WriteLine( "需要显示的按钮有:" + buttonStyleStr.Substring(1)); Console.WriteLine(); Console.WriteLine( "示例五:" ); AllowType userPermission = AllowType.Add | AllowType.Update | AllowType.Upload | AllowType.Download | AllowType.Select; string userPermissionStr = null ; if ((userPermission & AllowType.Edit) == AllowType.Edit) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Edit); } else { if ((userPermission & AllowType.Add) == AllowType.Add) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Add); } if ((userPermission & AllowType.Update) == AllowType.Update) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Update); } if ((userPermission & AllowType.Delete) == AllowType.Delete) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Delete); } if ((userPermission & AllowType.Upload) == AllowType.Upload) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Upload); } } if ((userPermission & AllowType.Read) == AllowType.Read) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Read); } else { if ((userPermission & AllowType.Select) == AllowType.Select) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Select); } if ((userPermission & AllowType.Download) == AllowType.Download) { userPermissionStr += "+" + Enum.GetName( typeof (AllowType), AllowType.Download); } } Console.WriteLine( "用户具备的权限有:" + userPermissionStr.Substring(1)); Console.WriteLine(); Console.WriteLine( "示例六:" ); int x1 = 108; Console.Write( "~位非运算:{0} -->> {1} ; {2} -->> {3}\n" , Convert.ToString(x1, 10), Convert.ToString(~x1, 10), Convert.ToString(x1, 2), Convert.ToString(~x1, 2)); Console.Write( "<<位左移(移5位)运算:{0} -->> {1} ; {2} -->> {3}\n" , //说白了讲:左移N位就是将二进制数后面补N位0 Convert.ToString(x1, 10), Convert.ToString(x1 << 5, 10), Convert.ToString(x1, 2), Convert.ToString(x1 << 5, 2)); Console.Write( ">>位右移(移5位)运算:{0} -->> {1} ; {2} -->> {3}\n" , //说白了讲:右移N位就是将二进制数后面删除N位数(不论0或1) Convert.ToString(x1, 10), Convert.ToString(x1 >> 5, 10), Convert.ToString(x1, 2), Convert.ToString(x1 >> 5, 2)); Console.Write( "^位异或(异或5)运算:{0} ^ {1} -->> {2} ; {3} ^ {4}-->> {5}\n" , Convert.ToString(x1, 10),Convert.ToString(5, 10), Convert.ToString(x1 ^ 5, 10), Convert.ToString(x1, 2), Convert.ToString(5, 2), Convert.ToString(x1 ^ 5, 2)); Console.ReadKey(); } static void FormatWrite( string n1, string n2, int d1, int d2, string opt) { string writeMsg = string .Format( "{0} {1} {2}" , n1, opt, n2); writeMsg += string .Format( " = {0} {1} {2}" , d1, opt, d2); string d1str = Convert.ToString(d1, 2), d2str = Convert.ToString(d2, 2); int maxLen = Math.Max(d1str.Length, d2str.Length); writeMsg += string .Format( " = {0} {1} {2}" , d1str.PadLeft(maxLen, '0' ), opt, d2str.PadLeft(maxLen, '0' )); switch (opt) { case "&" : { writeMsg += string .Format( " = 10进制:{0} 或 2进制:{1}" , Convert.ToString(d1 & d2, 10), Convert.ToString(d1 & d2, 2).PadLeft(maxLen, '0' )); break ; } case "|" : { writeMsg += string .Format( " = 10进制:{0} 或 2进制:{1}" , Convert.ToString(d1 | d2, 10), Convert.ToString(d1 | d2, 2).PadLeft(maxLen, '0' )); break ; } } Console.WriteLine(writeMsg); } static string GetFormatNumbersToStr(Func< int , int , string > ConvertToStringFunc, int toBase, bool showH, params int [] nums) { List< string > strs = nums.Select(n => ConvertToStringFunc(n, toBase)).ToList(); int maxLen = strs.Max(s => s.Length); string strLine = null ; foreach ( string str in strs) { string str1 = str.PadLeft(maxLen, '0' ); if (toBase == 16) str1 = "0x" + str1; if (showH) { strLine += "," + str1; } else { strLine += ",\n" + str1; } } return strLine.Substring(1); } enum ButtonStyle { None = 0x00, OK = 0x01, Cancel = 0x02, Alert = 0x04, Info = 0x08, OKCancel = 0x01 | 0x02, AlertInfo = 0x04 | 0x08 } enum AllowType { None = 0, Add = 1, Update = 2, Delete = 4, Select = 8, Upload = 16, Download = 32, Edit = Add | Update | Delete | Upload, Read = Select | Download } } } |