带位运算符的模式
Pattern with 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(' ');
}
}
你必须移动掩码而不是移动变量
#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
编辑:
如果您只需要设置一些位,只需使用按位或,
如果您需要清除一些位,请使用按位和:
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>
如果你需要清除一些位,使用按位和:
uint32_t a=1;
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010
a &= ~1; // clear first bit (or mask)
希望对您有所帮助。
如何设置变量的位以采用我想要的模式? 例如,如果我必须打印这个序列,我该如何进行?
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(' ');
}
}
你必须移动掩码而不是移动变量
#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
编辑:
如果您只需要设置一些位,只需使用按位或,
如果您需要清除一些位,请使用按位和:
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>
如果你需要清除一些位,使用按位和:
uint32_t a=1;
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010
a &= ~1; // clear first bit (or mask)
希望对您有所帮助。