2016-06-17 63 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