常见位运算的功能与用法(int,long,long long类型的数值范围)

#include <stdio.h>
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<<y:x左移y位,将x左边y位丢弃(注意丢弃的是为0的部分),在右边补y个0)
	        printf("%d\n",5>>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 <stdio.h>
/*
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


猜你喜欢

转载自blog.csdn.net/honeycomb_1/article/details/79682817
今日推荐