您的位置:首页 > 编程语言 > C#

[C#]我自己写的一个对字节中每位进行修改值的函数

2017-09-01 09:47 429 查看
位操作方法
代码如下:

1. 设置字节中某位的值

static public Byte s_SetBit(Byte byTargetByte, int nTargetPos, int nValue)
{
int nValueOfTargetPos = -1;

if (nValue != 0 && nValue != 1)
{
return 0;
}
if (!(nTargetPos >= 0 && nTargetPos < 8))
{
return 0;
}

switch (nTargetPos)
{
case 0:
nValueOfTargetPos = (byTargetByte >> 7) & 0x01;
if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x80);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0x7f);
}
break;

case 1:
nValueOfTargetPos = (byTargetByte >> 6) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x40);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xbf);
}
break;

case 2:
nValueOfTargetPos = (byTargetByte >> 5) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x20);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xdf);
}
break;

case 3:
nValueOfTargetPos = (byTargetByte >> 4) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x10);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xef);
}
break;

case 4:
nValueOfTargetPos = (byTargetByte >> 3) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x08);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xf7);
}
break;

case 5:
nValueOfTargetPos = (byTargetByte >> 2) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x04);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xfb);
}
break;

case 6:
nValueOfTargetPos = (byTargetByte >> 1) & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x02);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xfd);
}
break;

case 7:
nValueOfTargetPos = byTargetByte & 0x01;

if (nValue == 1)
{
byTargetByte = Convert.ToByte(byTargetByte | 0x01);
}
else if (nValue == 0)
{
byTargetByte = Convert.ToByte(byTargetByte & 0xfe);
}
break;

default:
break;
}

if (nValueOfTargetPos != -1)
{
return byTargetByte;
}
else
{
return 0;
}
}


测试案例:

把每位全为1的字节置0

Byte b = Convert.ToByte(0xff);
richTextBoxMain.Text = "byte初始状态: " + Convert.ToString(b, 2).PadLeft(8, '0') + "\r\n";
for (int i = 0; i < 8; i++)
{
b = s_SetBit(b, i, 0);
richTextBoxMain.Text += "byte修改第" + i + "位后的结果: ";
richTextBoxMain.Text += Convert.ToString(b, 2).PadLeft(8, '0') + "\r\n";
}


结果如下:

byte初始状态: 11111111
byte修改第0位后的结果: 01111111
byte修改第1位后的结果: 00111111
byte修改第2位后的结果: 00011111
byte修改第3位后的结果: 00001111
byte修改第4位后的结果: 00000111
byte修改第5位后的结果: 00000011
byte修改第6位后的结果: 00000001
byte修改第7位后的结果: 00000000

 

 

2. 获得字节中某位的值

static public int s_GetBit(Byte byTargetByte, int nTargetPos)
{
int nValue = -1;

switch (nTargetPos)
{
case 0:
nValue = (byTargetByte >> 7) & 0x01;
break;
case 1:
nValue = (byTargetByte >> 6) & 0x01;
break;
case 2:
nValue = (byTargetByte >> 5) & 0x01;
break;
case 3:
nValue = (byTargetByte >> 4) & 0x01;
break;
case 4:
nValue = (byTargetByte >> 3) & 0x01;
break;
case 5:
nValue = (byTargetByte >> 2) & 0x01;
break;
case 6:
nValue = (byTargetByte >> 1) & 0x01;
break;
case 7:
nValue = byTargetByte & 0x01;
break;
default:
break;
}

return nValue;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐