使用按位运算符的模式

时间:2016-06-17 10:12:59

标签: c bit-manipulation bitwise-operators

如何设置变量的位以采用我想要的模式? 例如,如果我必须打印此序列,我该如何处理?

11010010 11010010 11010010 11010010 

我编写了在此配置中打印和分隔位的代码,但不知道如何根据需要设置它们。

#include <stdio.h>
#include <limits.h>
int a;
void stampabit(a);
int main()
{
    int i;
    int n= sizeof(int) * CHAR_BIT;
    int mask = 1 << (n-1);

    for (i=1; i<=n; ++i){
        putchar(((a & mask)==0)?'0':'1');
        a<<=1;
        if(i%CHAR_BIT==0 && i<n)
            putchar(' ');
    }
}

2 个答案:

答案 0 :(得分:1)

您必须移动蒙版而不是移动变量

#include <stdio.h>
#include <limits.h>
unsigned int a = 0xAA55AA55;

int main()
{
    size_t i;
    unsigned int  n= sizeof(int) * CHAR_BIT;
    unsigned int  mask = 1 << (n-1);

    for (i=1; i<=n; ++i){
        putchar(((a & mask)==0)?'0':'1');
        mask>>=1;
        if(i%CHAR_BIT==0 && i<n)
            putchar(' ');
    }
    putchar('\n');
}

输出

10101010 01010101 10101010 01010101

根据需要将a的值更改为0xD2D2D2D2

11010010 11010010 11010010 11010010 

答案 1 :(得分:0)

编辑:
如果你只需要设置一些位,只需使用按位或,
如果你需要清除一些位,请使用按位和:

uint32_t   a=1;
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010
a &= ~1; // clear first bit (or mask) 

最好将显示代码与主代码分开以获得清晰的代码:

#include <stdio.h> 
#include <stdint.h>

void print_bits(uint32_t u){
    int i=31;
    do{
        if (u & 0x80000000) putchar('1'); else putchar('0');
        u <<= 1;
        if(i%8 == 0) putchar(' ');
    }while( --i >= 0);  
} 

int main(){  
    uint32_t   a=1;
    a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010
    a &= ~1; // clear first bit (or mask) 
    print_bits(a); //output: 11010010 11010010 11010010 11010010
}

旧:
如果你只需要设置一些位,只需按位使用或像这样:

void stampabit(int setBits){
    a |= setBits;
}

设置您的模式11010010 11010010 11010010 11010010使用此:

stampabit(0xD2D2D2D2 ); // stampabit(0b11010010110100101101001011010010);

工作示例:

#include <stdio.h>
#include <limits.h>
//#include <stdint.h>
int a=0;
void stampabit(int setBits){
    a |= setBits;
}
int main()
{
    int i;
    stampabit(0xD2D2D2D2 ); // stampabit(0b11010010110100101101001011010010);
    int n= sizeof(int) * CHAR_BIT; // number of bits in int (8, 16, 32, 64, ... bits)
    int mask = 1 << (n-1); // sign bit mask

    for (i=1; i<=n; ++i){
        putchar(((a & mask)==0)?'0':'1');
        a<<=1;
        if(i%CHAR_BIT==0 && i<n)
            putchar(' ');
    }
}

输出:

11010010 11010010 11010010 11010010

一些注意事项:
这里只是示例代码,它工作正常,但使用无符号类型显然表明您不需要符号位,并且它是防错的。
使用局部变量或移动局部变量比使用或移动全局变量更好,除非是故意的。

最后但并非最不重要的,如果你不需要平台依赖的int使用int32_t或uint32_t来自

#include <stdint.h>

如果你需要清除一些位,请使用bitwise和:

uint32_t   a=1;
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010
a &= ~1; // clear first bit (or mask)

我希望这会有所帮助。