#include
int main()
{
/* 负数转换成二进制:先是将对应的正整数转换为二进制后,对二进制取反,然后对结果加1.
如:42->00101010->11010101->11010110*/
int a,b,c,d;
while(~scanf("%d",&a))
{
printf("%d\n",5&4);//按位与即0101&0100,得二进制0100,即十进制4
b=~a;//按位非,如果某位是1,则改为0,反之亦然.如:a=5的二进制为00000101每位取反111111010,即b=-6
printf("%d\n",b);
printf("%d\n",5<<1);
//左移运算符,5左移1位的二进制为1010,即10 (x<>2);
/*
右移运算符,5右移2位的二进制为0001,即1 (将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。
在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,
在左边补上y个1);有符号数可以是负数,无符号数只能为0或正整数
*/
printf("%d\n",5^4);//按位异或,0101&0100,该位只有一个是1,结果为1,否则0,得二进制0001,即1(二进制相反时为1)
printf("%d\n",5|4);//按位或,0101&0100,至少一个为1则为1,都为0,则为0,得二进制0101,即5
}
return 0;
}
特别地,n&1:判断奇偶性; i>>j:i右移j位,即i除以2的j次方;
//计算二进制中1的个数
#include
/*
int f1(int num)
{
int coun=0;
int flag=1;
while(flag)
{
if(num&flag)
coun++;
flag<<=1;
}
return coun;
}
*/
int f2(int num)//一个整数减一,可以得到该整数的最右边的1变为0,这个1右边的0变为1。
//对这个整数和整数减一进行与运算,将该整数的最右边的1变为0,其余位保持不变。
//直到该整数变为0,进行的与运算的次数即为整数中1的个数。
{
int coun=0;
while(num)
{
num=num&(num-1);
coun++;
}
return coun;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
printf("%d\n",f2(n));
//printf("%d\n",2&2);
}
return 0;
}
int,long,long long类型的数值范围:
https://blog.csdn.net/qianbitou000/article/details/51939055