自己工作中遇到需要对单字节的高位、低位进行赋值,即一个字节byte,想要给每一位都赋值,这个值是动态来的,是0或是1。

好不容易收集到一些珍贵资料,整理一下:

一、设置

方法code:

/// <summary>
        /// 设置某一位的值
        /// </summary>
        /// <param name="data"></param>
        /// <param name="index">要设置的位, 值从低到高为 1-8</param>
        /// <param name="flag">要设置的值 true / false</param>
        /// <returns></returns>
        byte set_bit(byte data, int index, bool flag)
        {
            if (index > 8 || index < 1)
                throw new ArgumentOutOfRangeException();
            int v = index < 2 ? index : (2 << (index - 2));
            return flag ? (byte)(data | v) : (byte)(data & ~v);
        }

调用code:

byte s = set_bit(8, 8, true);

结果:

s 的值为 136, 结果正确。

二、获取值

获取一个字节中的每一位的值,需要分别与128 64 32 16 8 4 2 1相与&运算

假设字节为byte1

bit8 = byte1 & 128 == 128 ? 1 : 0; 
bit7 = byte1 & 64 == 64 ? 1 : 0; 
bit6 = byte1 & 32 == 32 ? 1 : 0; 
bit5 = byte1 & 16 == 16 ? 1 : 0; 
bit4 = byte1 & 8 == 8 ? 1 : 0; 
bit3 = byte1 & 4 == 4 ? 1 : 0; 
bit2 = byte1 & 2 == 2 ? 1 : 0; 
bit1 = byte1 & 1 == 1 ? 1 : 0;

另外,收集到网络上的其他资料:

引用:http://topic.csdn.net/u/20100121/11/66a2561e-49de-48d6-b0aa-4f3d1fea62e4.html

你好,感谢你阅读此帖.

今天我们要讨论的是在C#中如何获取一个数值中的某一位的数据,比如一个Byte型数据8,它的二进制表示为00001000(高位到低位),那我应该怎样获取它的第3位的值1呢?

我的想法是这样的,先把第3位的值右移7-3=4位,然后再右移7位,最后取这个值,这样就把第3位前后的值都变为0了,最后输出它的值为1.下面是我写的一个方法:

C# code
        /// <summary>
/// 获取数据中某一位的值
/// </summary>
/// <param name="input">传入的数据类型,可换成其它数据类型,比如Int</param>
/// <param name="index">要获取的第几位的序号,从0开始</param>
/// <returns>返回值为-1表示获取值失败</returns>
private int GetbitValue(byte input,int index)
{
if (index > sizeof(byte))
{
return -1;
}
//左移到最高位
int value = input << (sizeof(byte) - 1 - index);
//右移到最低位
value = value >> (sizeof(byte) - 1);
return value;
}

恳请大家指正,另外我想把它变成能处理不同数据类型的方法,比如运用范型,但是不知道怎么使用,请大家帮帮忙.

我看到C#中还有一些位操作的类,比如BitArray,BitVector32,好像都不合适,BitConvert好像也只是针对对字节流的转换

不知道大家有没有更好的方法,欢迎大家讨论.

祝你工作顺利,天天开心.

回复:

想看那一位是1就把第几位设置为1,其他设置为0,同input进行与操作,返回,大于0则是1,==0则是0.

回复:

//index从0开始 
//获取取第index位 
public static int GetBit(byte b, int index) { return ((b & (1 << index)) > 0) ? 1: 0; }
//将第index位设为1 
public static byte SetBit(byte b, int index) { return (byte)(b | (1 << index)); }
//将第index位设为0 
public static byte ClearBit(byte b, int index) { return (byte)(b & (byte.MaxValue - (1 << index))); }
//将第index位取反 
public static byte ReverseBit(byte b, int index) { return (byte)(b ^ (byte)(1 << index)); }

回复:

private static int GetbitValue(byte input, int index)
{
int value;
value = index>0? input >> index-1: input;
return value &= 1;
}

回复:

C# code

        //每8位为一个字节
private const int bitCout = 8; ///查询对象内存第index位值
static int GetValueOfIndex(object obj, int index)
{
int size = Marshal.SizeOf(obj);
System.IntPtr intPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj,intPtr,true);
byte[] byteArr = new byte[size];
Marshal.Copy(intPtr,byteArr,0,size);
int count;
index = Math.DivRem(index, 8, out count);
Marshal.FreeHGlobal(intPtr);
return (byteArr[size-index-1] >> (8-count-1)) & 1;
} for (int i = 0; i < 32; i++)
{
int j = (int)Math.Pow(2, i);
Console.WriteLine(j + " : " + GetValueOfIndex(j, 31 - i));
} Console.WriteLine(15.0f + " : " + GetValueOfIndex(13, 28));

C# 设置和获取一个字节的某一位的值的方法的更多相关文章

  1. 前端JQuery中获取一个div下的多个id值

    获取所有的Id值,方法是通过div.class获取全局的值,然后再提取具体的Id值 方法一:用for循环,因为$("div.class")获取的是一个数组,通过循环读取出数组中的每 ...

  2. 获取一个数组(vector)与查找值(value)的差最小绝对值的成员索引的算法

    代码如下: 函数作用:传递进来一个数组(vector),和一个需要查找的值(value),返回与value的差值绝对值最小的vector成员索引,若value不在vector范围中,则返回-1: in ...

  3. 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

    目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...

  4. Java设置以及获取JavaBean私有属性进阶

    在上一篇博客中讲到使用Java提供的原生API设置以及获取一个JavaBean的私有属性. 但是使用Java的原生API过于复杂,有没有更加简单的方法呢?答案是肯定的.下面介绍一个开元工具包来非常方便 ...

  5. Python读字节某一位的值,设置某一位的值,二进制位操作

    Python读字节某一位的值,设置某一位的值,二进制位操作   在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1.True和Fa ...

  6. VC++获取一个GB级大文件的字节大小

    常规的获得小文件(2.1GB以下)的字节大小可以使用ftell,函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数.使用fseek函数后再调用函数ftell()就能非常容易地确定文 ...

  7. 每天一个JavaScript实例-展示设置和获取CSS样式设置

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:

    在目录下创建tools(python package) 在tools中创建crawl_xici_ip.py文件写入代码如下: #coding=utf-8 import requests from sc ...

  9. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

随机推荐

  1. JQuery教程

    1.是javaScript库(js文件) 2.使用:script标签 3.语法:$开头 $().action() 列如:$('div').css("color",'red'); 4 ...

  2. FreeBSD_11-系统管理——{Part_0-基础}

    Tips: sysctl -d kern.maxvnodes #查看系统控制选项的含义 true > file #清空文件内容 alias ls 'ls -I(大写i)' #取消 root 的 ...

  3. Hyper-V 共享式网络链接 端口映射

    远程路由访问我配置了很久都不成功,经过多方搜索,现面的命令能实现端口映射一.查询端口映射情况netsh interface portproxy show v4tov4查询这个IP所有的端口映射.net ...

  4. Web 通信 之 长连接、长轮询(long polling)

    基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...

  5. java 字符串截取

    截取指定长度的字符串,如果超出就用more的内容来替换 截取的字节数,截取的时候,有可能会少截取一位(当最后一位是1个双字节的话,会少截取一个) public class Test {    publ ...

  6. BZOJ 4247: 挂饰 题解

    Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直 ...

  7. 关于HTML5代码总结。

    在阅读完HTML5后,自己把一些常用的代码总结了一下,自认为比较全,如果有什么错误请指出. 1.<!DOCTYPE html>声明这是一个HTML5的页面 2.<HTML lang= ...

  8. javascript基础知识-语句

    关于javascript语句,有下面一些有趣的用法. 1.空语句的使用: 空语句只包含一个";",那在什么时候可以使用呢? 例: //初始化一个数组a for(i = 0;i &l ...

  9. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  10. [1001]mod

    输入一个数,如果其是3的倍数就输出“3”,如果是2的倍数就输出“2”,都是则输出“1”,否则输出“0”: 输入输出样例: 输入: 9 输出: 3 输入: 7 输出: 0 Hint 使用一下形式的条件语 ...