C/C++取出变量的每一位的值(第一次知道还有QBitArray)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++取出变量的每一位的值(第一次知道还有QBitArray)相关的知识,希望对你有一定的参考价值。
前写程序最多也只是字节级别操作,用char和memcpy进行一系列内存操作。此次一个sdk,其状态值直接是每位一个标示,所以需要取出每位进行操作。当然CPP也有丰富的位运算操作,但是虽然也学过,知道意思,但是实际却几乎没用过。这次只能动用它了。
第一种方法:思路就是全部用位与,这样就能取出来每一位是否为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; |
这是取一个无符号整数的,当然其他类型一样的、、
第二种方法,就是动用STL,CPP处理方便的确方便多了。有伟大的bitset。
其构造函数就可以直接帮你取出值放到bitset中,其支持ullong类型还有string类型。
其也能直接转换为string类型。缺点是其大小必须在编译器就指定。
只是注意:在bitsit中取出的位置和转换后的string取出的方向是不一样(个人测试得出:bitset是从右向左,string是从坐向右)。
在Qt中也有一个处理位的类:QBitArray
这个类是可以更改大小的,用resize()去设定新的大小。只是这个类只能你自己一个位,一个位的去赋值(QBitArray 是从左向右方向的)。
QBitArray 和bitset都重载了 &,~,| ,^这些位运算符号。
下面给个都用的例子:(注意bitset[ n] 和 string[n] 取值的方向不一样。 )
01 |
#include <QCoreApplication> |
08 |
int main( int argc, char *argv[]) |
10 |
QCoreApplication a(argc, argv); |
14 |
bits.resize(( sizeof (uint) * 8)); |
17 |
for (uint k = 0;k < sizeof (uint) * 8;(j = j<<1),k++){ |
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); |
其输出结果为:
http://www.dushibaiyu.com/2015/07/cpp_get_bit_value.html
以上是关于C/C++取出变量的每一位的值(第一次知道还有QBitArray)的主要内容,如果未能解决你的问题,请参考以下文章
winform怎么读一个16位整数的每一位
ACM之数论数字根
编写程序数一下 1到 100 的所有整数中出现多少次数字9(对整数每一位的提取方法)
lowbit() 运算
ACM之数论数字根
Codeforces 916B - Jamie and Binary Sequence (changed after round)