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


  • 相关阅读:
    HashMap看这篇就够了
    01 语言基础+高级:1-8 File类与IO流_day09【字节流、字符流】
    01 语言基础+高级:1-8 File类与IO流_day08【 File类、递归】
    01 语言基础+高级:1-6 集合_day02【Collection、泛型】
    数据库相关的收藏文章
    SSM到Spring Boot-校园商铺平台
    01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】
    在Mac OS X系统中的十大简单实用使用技巧
    轻松测试你的词汇量
    程序员,你应该懂de
  • 原文地址:https://www.cnblogs.com/jingmoxukong/p/2118291.html
Copyright © 2011-2022 走看看