2016-06-17 64 views
3

如何设置变量的位以呈现我想要的模式? 例如,如果我必须打印这个序列,我该如何处理?使用按位运算符的模式

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(' '); 
    } 
} 
+0

'a'和'mask'应该是'unsigned',因为你正在转移到m.s.位(否则为符号位)。在这种情况下,'unsigned a = 0xd2d2d2d2;' –

+0

您的未实现函数void void(a);'将需要'unsigned stampabit(void);'或'void stampabit(unsigned * a);'但是不清楚你正在努力去做。也许你打算把32次“stampabit”称为“a”。 –

回答

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 
+0

感谢您的回复。为什么使用0xAA55AA55? – ennedes

+0

由于全局变量为0,因此要显示一个值。价值本身是一种专业变形;) – LPs

+0

这真的很有用。我如何找到我需要的位的值? – ennedes

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 

一些注意事项:
这里只需示例代码,它工作正常,但使用无符号类型是cl早期显示你不需要签名,这是bug证明。
使用局部变量或移动局部变量比使用或移动全局变量要好,除非这是有意的。

最后但并非最不重要,如果你不需要依赖于平台INT使用int32_t或uint32_t的从

#include <stdint.h> 

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

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

我希望这可以帮助。

+0

C没有二进制文字'0b ...'。 – interjay

+0

我正在使用Dev-Cpp,它支持。但在你的情况下使用十六进制值。 –

+0

Dev-cpp是一个IDE,不是编译器。你的编译器(可能是GCC)支持它作为扩展,但它不是标准C. – interjay