前写程序最多也只是字节级别操作,用char和memcpy进行一系列内存操作。此次一个sdk,其状态值直接是每位一个标示,所以需要取出每位进行操作。当然CPP也有丰富的位运算操作,但是虽然也学过,知道意思,但是实际却几乎没用过。这次只能动用它了。

第一种方法:思路就是全部用位与,这样就能取出来每一位是否为1。直接上代码吧,反正看了也就理解了。

1 uint j = 1;
2 for (uint k = 0;k < sizeof(uint) * 8;(j = j<<1),k++){
3     std::cout << "The " << k << " bit is :" << (i&j)  << std::endl;
4 }

这是取一个无符号整数的,当然其他类型一样的、、

第二种方法,就是动用STL,CPP处理方便的确方便多了。有伟大的bitset

其构造函数就可以直接帮你取出值放到bitset中,其支持ullong类型还有string类型。

其也能直接转换为string类型。缺点是其大小必须在编译器就指定。

只是注意:在bitsit中取出的位置和转换后的string取出的方向是不一样(个人测试得出:bitset是从右向左,string是从坐向右)。

在Qt中也有一个处理位的类:QBitArray

这个类是可以更改大小的,用resize()去设定新的大小。只是这个类只能你自己一个位,一个位的去赋值(QBitArray 是从左向右方向的)。

QBitArray 和bitset都重载了 &,~,| ,^这些位运算符号。

下面给个都用的例子:(注意bitset[ n] 和 string[n] 取值的方向不一样。 )

01 #include <QCoreApplication>
02 #include <QVariant>
03 #include <QBitArray>
04 #include <QDebug>
05 #include <bitset>
06 #include <iostream>
07  
08 int main(int argc, char *argv[])
09 {
10     QCoreApplication a(argc, argv);
11     uint i = 200;
12  
13     QBitArray bits;
14     bits.resize((sizeof(uint) * 8));
15  
16     uint j = 1;
17     for (uint k = 0;k < sizeof(uint) * 8;(j = j<<1),k++){
18         bits.setBit(k,(i&j));
19     }
20  
21     qDebug() << "QBitArray bits :" << bits;
22     std::bitset<sizeof(uint) * 8> bit(i);
23     std::cout << "std::bitset bit : " << bit << std::endl;
24     std::string str = bit.to_string();
25     std::cout << "std::bitset bit.to_string : " << str << std::endl;
26     std::cout << "std::bitset bit at 3 : " << bit[3] << std::endl;
27     std::cout << "std::string str at 3 : " << str.at(3) << std::endl;
28     qDebug() << "QBitArray bits at 3 :" << bits.at(3);
29  
30     return a.exec();
31 }

其输出结果为:

http://www.dushibaiyu.com/2015/07/cpp_get_bit_value.html

C/C++取出变量的每一位的值(第一次知道还有QBitArray)的更多相关文章

  1. C语言变量长度在32位和64位处理器上的关系

    C语言变量长度在32位和64位处理器上的关系       理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算).常用数据类型对应字节数 ...

  2. C# 设置和获取一个字节的某一位的值的方法

    自己工作中遇到需要对单字节的高位.低位进行赋值,即一个字节byte,想要给每一位都赋值,这个值是动态来的,是0或是1. 好不容易收集到一些珍贵资料,整理一下: 一.设置 方法code: /// < ...

  3. Objective-C中变量采用@property的各个属性值的含义

    我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值.但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量 ...

  4. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  5. mysql按位的索引判断位的值

    DELIMITER $$ DROP FUNCTION IF EXISTS `value_of_bit_index`$$/*计算数字的某个位的值*/CREATE FUNCTION `value_of_b ...

  6. eclipse自动生成变量名声明(按方法返回值为本地变量赋值)

    eclipse自动生成变量名声明(按方法返回值为本地变量赋值) ctrl+2+L 这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同时按完以后释放,再快速按L.不能同时按! 比如写这句代 ...

  7. 小冷-wireshark的标志位的值是啥

    小冷系列之 wireshark的标志位的值是啥,在用wireshark抓包时,发现Flags = 0x002(SYN),很好奇0x002是什么意思. 好不好先上图: 上图是一个三次握手第一次的标志位, ...

  8. 如何直接修改cf,of等标志位的值?

    如何直接修改 cf,of 等 标志寄存器位的值? 我记得在哪个教程里见过,但是不太记得了… 貌似是在yjx驱动教程里面… 我想弄这个的原因是想验证 网上查到的 各种跳转语句(ja,jl,jg等) 需要 ...

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

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

随机推荐

  1. Angular JS 学习笔记(一)

    1. 菜鸟教程:http://www.runoob.com/angularjs/angularjs-tutorial.html 2. Angular JS中文网:http://www.apjs.net ...

  2. 更新Windows Azure Web Site中的Orchard版本

    官方建议大家使用本地副本来更新 1.首先做个全站备份,这样更新好以后出问题你就很容易回滚 . Web Site 做备份很方便.把网站SCALE设置到STANDARD,然后在BACKUPS页面里面点备份 ...

  3. Visual Studio Tools for Unity安装及使用

    Visual Studio Tools for Unity安装及使用 转载自:CSDN 晃了一下,10.1到现在又过去两个月了,这两个月什么也没有学,整天上班下班,从这周末开始拾起unity,为了年后 ...

  4. Value Categories

    Value categories Three primary categories primary categories mixed special Each C++ expression (an o ...

  5. java源代码如何打成jar包

    链接地址:http://jingyan.baidu.com/article/046a7b3ed8b23ef9c27fa9b9.html 有时自已写了一个很巧妙的方法,想分享给别人用,这时我们就可以将其 ...

  6. js 完成单继承

    //1.使用prototype完成单继承. //定义一个A类 function A(){ } //为A类动态调用属性color,与方法sayColor A.prototype.color = &quo ...

  7. MySQL 5.6.x 配置数据库主从复制

    [转]http://blog.csdn.net/lwprain/article/details/10966837 备注: 在配置之前如果之前配置过主从没成功的话, 最好把master数据库目录下的my ...

  8. Qt 学习 之 二进制文件读写

    在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...

  9. 51cto培训课程

    课程: 云计算: OpenStack | 虚拟化 | 云平台 | Office 365 | 云服务 | Docker | 其他 大数据: Spark | Hadoop | Storm | Hive | ...

  10. hdu4405概率dp入门

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...