zoukankan      html  css  js  c++  java
  • [C#]我自己写的一个对字节中每位进行修改值的函数

    位操作方法

    代码如下:

    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;
    }
    


  • 相关阅读:
    [原创]浅谈测试团队转型,思维模式的转变是关键
    [原创]浅谈IT人如何做理财规划
    [原创]浅谈对华为34岁以上员工“退休”
    [原创]2017年1月读书推荐
    [原创] 上海利得基金招聘测试经理/测试工程师/测试开发工程师(长期有效)
    [原创]浅谈从“述职”向“述能”转变
    IBM的IT战略规划方法论
    腾讯企业大学培训经验
    [原创]Android App上线检查checklist
    移动开发规范
  • 原文地址:https://www.cnblogs.com/jingmoxukong/p/2118291.html
Copyright © 2011-2022 走看看