2013-07-28 111 views
1

我想用它返回应该包含8个比特的信息,在小尾数格式的uint32_t功能位。可能有人给我如何提取从uint32_t型这些位为字符,布尔值或到任何其他类型不需要使用部队来处理一些C++代码!因为现在我没有耐心来理解整体概念。而更多的我搜索您的理解更为复杂,似乎...谢谢!读取uint32_t的

PS。虽然我觉得不是我所期待的,如果有人也可以张贴在一个如何能够编码8位一些代码(例如8个布尔)在uint32_t将是有趣的,这将有助于我理解这个概念。谢谢!

回答

0

字节顺序不应该在这里的一个问题。你试过了吗?

+0

嗯,我已经尝试“推”uint32_t到一个字符串流并从中获取一个字符串,但我得到的字符串只包含一个零。所以我想它不能正确提取这些位。 – venkman

+0

你典型的stringstream不应该提取位。只是为了记录:我们在说什么语言?有关位函数的引言,另请参见[位操纵](http://en.wikipedia.org/wiki/Bit_manipulation)。 – usr2564301

0

小尾数是指组成uint32_t的字节具有存储在最低的内存地址中的至少显著字节,在最高最显著。当提取位时,Endian-ness不应该输入图片。如果您正在通过char *访问uint32_t变量,它只会进入图片。

#include <iostream> 
#include <cstdint> 
using namespace std; 

int main() 
{ 
    unsigned char ch; 
    uint32_t u32; 
    bool b0, b1, b2, b3, b4, b5, b6, b7; 

    // If the 8 bits you need are the least significant ones then getting 
    // them is as easy as: 
    u32 = 73; 
    ch = u32 & 0xFF; 
    cout << ch << endl; 

    // To encode boolean variables is just as easy: 
    b0 = b1 = b3 = b5 = 0; 
    b2 = b4 = b6 = b7 = 1; 
    u32 = (b0 << 0) | (b1 << 1) | (b2 << 2) | (b3 << 3) | (b4 << 4) | 
     (b5 << 5) | (b6 << 6) | (b7 << 7); 
    cout << hex << u32 << endl; 

    return 0; 
} 
0

当访问一个变量,它会自动由系统(在86的情况下,小端)的默认字节顺序加载的,所以如果你想低8位,只敷个面膜和获取值

x = someint32 & 0xff; 

同样地,分配charint,或使用它在表达将扩展(有符号或零依赖于炭的signess),字节序不应该在这里是一个问题。如果您想直接访问内存,则只应该注意字节顺序。

2

在C A样品,使用union来强制的整数,并且在相同的地址空间组合的位的值以及与位域b0..b7持有单个比特值:

#include <stdio.h> 

union Bitfields { 
    unsigned int as_int; 
    struct { 
     unsigned char b0:1,b1:1,b2:1,b3:1, 
     b4:1,b5:1,b6:1,b7:1; 
    } as_bit; 
}; 

int main (void) 
{ 
    Bitfields bitfield; 

    bitfield.as_int = 73; 

    printf ("%u %u %u\n", bitfield.as_int, bitfield.as_bit.b0, bitfield.as_bit.b1); 

    return 0; 
} 

这允许容易读/写访问到整数值和每个独立的位,任何更方便。