前写程序最多也只是字节级别操作,用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. iOS中的 SB和XIB的前世今生

    今天给大家介绍一下Apple开发中三种几种常用的应用程序编写方式:纯代码创建.使用storyboard/XIB.我们都知道,纯代码编写模式适合大型项目大规模使用,利于版本管理.追踪改动以及代码合并,代 ...

  2. struts的常用配置

    struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUB ...

  3. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  4. tasklet和工作队列

    tasklet机制和工作队列 http://blog.chinaunix.net/uid-28236237-id-3450753.html tasklet原理 http://www.kuqin.com ...

  5. Flask中全局变量的实现

    我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...

  6. js基本框架

  7. BZOJ 1684: [Usaco2005 Oct]Close Encounter

    题目 1684: [Usaco2005 Oct]Close Encounter Time Limit: 5 Sec  Memory Limit: 64 MB Description Lacking e ...

  8. hdu 4679 (树形DP)

    题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的. 刚开始理解错题意了,wro ...

  9. javascript特效:会随着鼠标而动的眼睛

    这个特效非常简单,其中眼球和眼珠都是特定的图片.只要掌握好距离坐标就没问题.我就直接贴代码,有兴趣的朋友可以自己复制下来运行一下,下面的眼睛图像就是我的文件用到的图像,比较难看..我就把我的代码贴出来 ...

  10. [ArcGIS必打补丁]ArcGIS 10.1 SP1 for (Desktop, Engine, Server) Quality Improvement Patch

    大家都知道假设希望保证企业级GIS系统的稳定执行,除了使用最新的ArcGIS版本号产品以外,还须要打上相关的补丁. 补丁分为:Service Pack和Patch 比如,假设你使用的ArcGIS10. ...