简简单单学会C#位运算
作者:梦在旅途 发布时间:[ 2016/7/14 10:40:56 ] 推荐标签:测试开发技术 .NET 位运算
一、理解位运算
要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即: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
综合示例如下:
int i10 = 68;
int i16 = 0x2A;
Console.WriteLine("示例一:");
Console.Write("10进制【68】转成2、8、16进制结果:{0}、{1}、{2}
",
Convert.ToString(i10, 2), Convert.ToString(i10, 8), Convert.ToString(i10, 16));
Console.Write("16进制【0x2A】转成2、8、10进制结果:{0}、{1}、{2}
",
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
三、初识位运算(位与与位或运算)
本文一开始说明了,位运算是二进制每位数字的运算操作,下面通过代码示例来初识位运算
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;
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11