zoukankan      html  css  js  c++  java
  • C/C++取出变量的每一位的值(第一次知道还有QBitArray)

    前写程序最多也只是字节级别操作,用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 }

    其输出结果为:

    bitvalue

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

  • 相关阅读:
    浅析深度优先和广度优先遍历实现过程、区别及使用场景
    浅析为什么要用setTimeout模拟setInterval
    app弹出软键盘获取键盘高度不准确的原因及导致底部定位的元素无法贴近键盘的问题
    App平台iOS设备上因内存不足导致白屏、闪退的原因及其解决方案
    浅谈移动端开发技术
    浅析Console命令调试常用方法
    js正则表达式中的正向肯定预查和正向否定预查, 反向肯定和反向否定(这个翻译不准确)
    javascript的版本查看及js的历史
    【转】JS-正则表达式的反向引用
    【转】Linux虚拟网络设备之tun/tap
  • 原文地址:https://www.cnblogs.com/findumars/p/5176414.html
Copyright © 2011-2022 走看看