C++ Qt:按位运算

Posted

技术标签:

【中文标题】C++ Qt:按位运算【英文标题】:C++ Qt: bitwise operations 【发布时间】:2009-06-02 06:56:50 【问题描述】:

我正在为大学做一个小项目,我需要对网络传输进行建模,并实现和可视化不同类型的纠错算法。我的即兴数据包由一个quint8组成:我需要将它转换为一个位数组,如QBitArray,附加一个校验位,通过UDP传输,用校验位检查传输是否成功,然后从中构造quint8 . 再说一次,这不是一个实用的任务,而是一个教育任务,所以不要建议我使用像 CRC 这样的真正算法......

所以我的问题是:如何将任何数据类型(在本例中为 quint8)转换为 QBitArray? 我的意思是计算机中的任何数据都是位数组,但我如何访问它是问题。

谢谢,德米特里。

【问题讨论】:

【参考方案1】:

让我们看看我们能不能把它弄对

template < class T >
static QBitArray toQBit ( const T &obj ) 
    int const bitsInByte= 8;
    int const bytsInObject= sizeof(T);

    const quint8 *data = static_cast<const quint8*>(&obj) ;
    QBitArray result(bytsInObject*bitsInByte);
    for ( int byte=0; byte<bytsInObject ; ++byte ) 
        for ( int bit=0; bit<bitsInByte; ++bit ) 
            result.setBit ( byte*bitsInByte + bit, data[byte] & (1<<bit) ) ;
        
    
    return result;


void Foo () 
    Bar b ;
    QBitArray qb = toQBit ( b ) ;

【讨论】:

谢谢,这就是我想要的。第 6 行的错字:quint8 而不是 qint8。 欢迎您,错字已修复【参考方案2】:

qint8 实际上是带符号的字符。所以你可以把你的 objs 当作一个 char 数组。

template < class T >
QBitArray toQBit ( T &obj ) 
    int len = sizeof(obj) * 8 ;
    qint8 *data = (qint8*)(&obj) ;
    QBitArray result ;
    for ( int i=0; i< sizeof(data); ++i ) 
        for ( int j=0; j<8; ++j ) 
            result.setBit ( i*8 + j, data[i] & (1<<j) ) ;
        
    
    return result;


void Foo () 
    Bar b ;
    QBitArray qb = toQBit ( b ) ;

【讨论】:

程序将崩溃...您的代码中至少有 2 个错误。【参考方案3】:

我认为声明模板函数然后将其参数转换为 uint8 没有任何意义。 可提升为 unsigned long 类型的解决方案

#include <bitset>
template <typename T>
QBitArray toQBit(T val) 
    std::bitset<sizeof(T) * 8> bs(val);
    QBitArray result(bs.size());
    for (int ii = 0; ii < bs.size(); ++ii) 
        result.setBit(ii, bs.test(ii));
    
    return result;

一般来说,无法将任何数据类型转换为位数组。特别是如果您的数据类型包含指针,您可能想要传输指针而不是指针。所以任何复杂的类型都应该分开处理。并注意不同架构中的不同字节序(小字节序和大字节序)。根据这个问题,我认为 std::bitset 是安全的,但是例如将指向 struct 的指针转换为 char 数组并存储其位可能不安全。

【讨论】:

以上是关于C++ Qt:按位运算的主要内容,如果未能解决你的问题,请参考以下文章

按位非运算符

位运算

位运算

c++程序中->second 是啥意思

位运算符

c语言的按位运算符怎么操作!?