首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用按位反转

使用按位反转
EN

Stack Overflow用户
提问于 2010-03-25 21:09:23
回答 5查看 3.8K关注 0票数 5

我正在尝试以字节为单位进行位反转。我使用下面的代码

代码语言:javascript
复制
static int BitReversal(int n)
{
    int u0 = 0x55555555; // 01010101010101010101010101010101
    int u1 = 0x33333333; // 00110011001100110011001100110011
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111
    int u4 = 0x0000FFFF;
    int x, y, z;
    x = n;
    y = (x >> 1) & u0;
    z = (x & u0) << 1;
    x = y | z;

    y = (x >> 2) & u1;
    z = (x & u1) << 2;
    x = y | z;

    y = (x >> 4) & u2;
    z = (x & u2) << 4;
    x = y | z;

    y = (x >> 8) & u3;
    z = (x & u3) << 8;
    x = y | z;

    y = (x >> 16) & u4;
    z = (x & u4) << 16;
    x = y | z;

    return x;
}

它可以反转位(在32位机器上),但是有一个问题,例如,输入是10001111101,我想要得到10111110001,但是这个方法会反转包括标题0在内的整个字节。输出为1011111000100000000000000000000000。有没有什么方法可以只反转实际的数字?我不想将其转换为字符串和反转器,然后再次转换。有没有纯粹的数学方法或位运算方法?

诚挚的问候,

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-25 21:13:54

Cheesy的方式是换档,直到你得到右边的1:

代码语言:javascript
复制
if (x != 0) {
    while ((x & 1) == 0) {
        x >>= 1;
    }
}

注意:您应该将所有变量切换为unsigned int。正如所写的那样,你可以在任何时候右移时使用不需要的符号扩展名。

票数 1
EN

Stack Overflow用户

发布于 2010-03-25 21:12:15

使用类似的方法获得最高比特数,并将结果比特向右移动33 -#比特,瞧!

票数 4
EN

Stack Overflow用户

发布于 2010-03-25 21:13:05

一种方法是找到数字n中的前导符号位数,将n左移该数字,然后通过上面的算法运行它。

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

https://stackoverflow.com/questions/2515715

复制
相关文章

相似问题

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