首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何掩码比特?

如何掩码比特?
EN

Stack Overflow用户
提问于 2017-02-13 21:32:22
回答 2查看 239关注 0票数 1

我有一个字节,它的二进制值是11111111。根据这些规则,我必须将我的字节扩展到16位0101010101010101 :如果位= 1,那么现在是01。如果位= 0,则现在是10。

例如:

代码语言:javascript
运行
AI代码解释
复制
00001111 -> 1010101001010101
00000101 -> 1010101010011001

执行此操作的操作是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-02-13 21:56:20

首先,将您的字节转换为int:

代码语言:javascript
运行
AI代码解释
复制
int x = (int)byte_value;

然后,扩展到16位,方法是一次移位4位,然后移位2位,然后移位1位,然后使用移位和逐位OR将每个位加倍:

代码语言:javascript
运行
AI代码解释
复制
x = ((x << 4) | x) & 0b0000111100001111;
x = ((x << 2) | x) & 0b0011001100110011;
x = ((x << 1) | x) & 0b0101010101010101;
x = (x << 1) | x;

然后,掩码比特,如果比特是1,则偶数比特位置为1,如果比特是0,则奇数位置为1(使用逐位NOT):

代码语言:javascript
运行
AI代码解释
复制
x = (x & 0b0101010101010101) | (~x & 0b1010101010101010);
票数 1
EN

Stack Overflow用户

发布于 2017-02-13 21:45:46

我不认为有一个运算符可以像描述的那样“扩展”比特。但是,您可以在循环中进行移位和测试,如下所示:

代码语言:javascript
运行
AI代码解释
复制
unsigned char b = 0xff;
unsigned int result = 0x0;

for (int i=0; i<8; i++) {
    result <<= 2;  // make place for the next 2 bits

    int isSet = b & 0x80; // check highest significant bit of b
    if (isSet) {
        result |= 0x01;  // in bits: 01
    }
    else {
        result |= 0x02; // in bits: 10
    }

    b <<= 1;
}

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42213947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档