【问题标题】:ERROR in understanding bit-wise operations理解按位运算的错误
【发布时间】:2014-05-26 02:56:01
【问题描述】:

我有无符号整数(32 位),想分成 3 组,每组 12 位。 但是,我无法正确提取数字。 例如假设我有 32 位无符号整数,如下所示:

1111 0000 1011 0000 1010 1001 1100 1101  

那么我想要这样的东西:

S1 = 1111 0000 1011 
s2 = 0000 1010 1001 
s3 = 1100 1101 

程序:

    #include<stdio.h>

    int main() {
            short s1,s2,s3 = 0
            unsigned int addr = 4194624;

            s1 = addr>>12;
            addr = addr>>12;
            printf("%d\n", s1);
            s2 = addr>>12;
            addr = addr>>12;
            printf("%d\n", s2);
            s3 = addr>>12;
            addr = addr>>12;
            printf("%d\n", s3);

            return 0;
    }

【问题讨论】:

  • 你正在修改addr变量,你应该将它复制到一个临时的并对其进行操作
  • 嗯,12 * 3 = 36 大于 32。你可以有两个 12 位数字和一个 8 位数字,但你不能再放了。
  • 短裤有at least 16 bits,所以除非你真的想用3条短裤,否则只需要两条。
  • @user3114046 如何以二进制打印?我可以吗 ?一周前我已经开始学习 c 语言了。
  • 我的意思是:s3 应该左对齐以便它实际上是1100 1101 0000 还是右对齐以便它是0000 1100 1101

标签: c++ c bit-manipulation bitwise-operators


【解决方案1】:

这对我有用。

// Just pick up the last 8 bits of addr and
// assign it to s3.
s3 = addr & 0xFF;

// Shift addr by 8 bits to the right, then pick up
// just the last 12 bits of the resulting number, and then
// assign it to s2.
s2 = (addr >> 8) & 0xFFF;

// Shift addr by 20 bits to the right and then assign
// the resulting number to s1.
s1 = (addr >> 20);

【讨论】:

  • 我想如果你把它改成s3 = (addr &amp; 0xff) &lt;&lt; 4;,因为op希望s3用零填充。
  • @jaket 我没有那种印象。但是,如果他们愿意,希望他们有必要的信息来做到这一点。
【解决方案2】:

你可以使用这样的函数来提取位:

short f( unsigned int number, int start, int end)
{
    unsigned int mask = (1 << (end - start)) - 1;
    return ( number >> start) & mask;
}

然后:

int main() {

    short s1,s2,s3 = 0;
    unsigned int addr = 4194624;

    s1 = f( addr, 20, 31);
    s2 = f( addr, 8, 19);
    s3 = f( addr, 0, 7);

    printf("%d\n", s1);
    printf("%d\n", s2);
    printf("%d\n", s3);
    return 0;
}

打印:

4

1

64

http://ideone.com/Q5mV94

【讨论】:

    【解决方案3】:

    从 cmets 复制 - 首先看到你有一个 32 位数字,我所做的是将它存储在另一个变量中,然后将其右移 20 位,所以我的新数字是 12 位编号,然后在其他两个 12 位链上进行相同的操作以获取所需的编号

    #includde<stdio.h>
    #include<conio.h>
    
    void main()
    {
        unsigned long a=4194624,e;
        int b,c,d;
        e=a;
        e=e>>20;
        b=e;
        e=a;
        e=e<<12;
        e=e>>20;
        c=e;
        e=a;
        e=e<<24;
        e=e>>24;
        d=e;
        printf(" %d %d %d ",b,c,d);
        getch(); 
    }
    

    【讨论】:

    • 请为您的回答提供评论,以便 OP 和未来的 SO 访问者知道您在这里尝试什么 - 以及为什么。
    • 首先看到你有一个 32 位数字我所做的是将它存储在另一个变量中,然后将其右移 20 位,所以我的新数字是一个 12 位数字,然后是相同的操作在其他两个 12 位链上完成了获得所需数量的操作
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2022-05-19
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多