位运算的奇技淫巧

Posted ~千里之行,始于足下~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算的奇技淫巧相关的知识,希望对你有一定的参考价值。

左移操作符 移位规则:
左边抛弃、右边补0
右移操作符 移位规则:

  1. 逻辑移位 左边用0填充,右边丢弃(无符号数)
  2. 算术移位 左边用原该值的符号位填充,右边丢弃(有符号数)
    注:对于移位运算符,不要移动负数位
//求一个整数存储在内存中二进制中1的个数 四种方法
#include<stdio.h>
int countBit1(int num)
{
	int count = 0;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num /= 2;
	}
	return count;
}

int countBit2(int num)
{
    //左移
	int count = 0;
	int len = sizeof(int) * 8;
	int i = 0;
	while (i < len)
	{
		if (num & (1 << i))
		{
			count++;
		}
		i++;
	}
	return count;
} 

int countBit3(int num)
{
	//右移只限于无符号数或有符号数的正值(负值右移会补符号位) 
	int count = 0;
	int len = sizeof(int) * 8;
	int i = 0;
	while (i < len)
	{
		if ((num >> i) & 1)
		{
			count++;
		}
		i++;
	}
	return count;
}

int countBit4(int num)
{
    //效率最高
	int count = 0;
	while (num)
	{
	    //没执行一次循环,消掉一个1
		num &= (num-1);
		count++; 
	}
	return count;
}

int main()
{
	//求一个整数存储在内存中二进制中1的个数 
	printf("%d\\n", countBit1(0xff));
	printf("%d\\n", countBit2(0xff));
	printf("%d\\n", countBit3(0xff));
	printf("%d\\n", countBit4(0xff));
}
#include<stdio.h>
int main()
{
    定义 int(有符号数) unsigned (无符号数)
    //%u 无符号数 %d有符号数
    //~按位取反,!逻辑取反 
    printf("%u\\n", ~0); //1111 ... 1111 无符号数 
    printf("%u\\n", !0); //1 真 
	printf("%d\\n", !0); //1 真 
	printf("%d\\n", ~0); //1111 ... 1111(补)有符号数 1000 ... 0001(原码)  
	unsigned int a = -1;
	printf("%u\\n",a);//无符号数存负数,存入的是补码 
	printf("%u\\n", a >> 1); //右移一位 0111 ... 1111
	return 0; 
}

在这里插入图片描述
未完,代结~~。

以上是关于位运算的奇技淫巧的主要内容,如果未能解决你的问题,请参考以下文章

位运算

位运算

一些位运算的技巧

javascript 向下取整 奇技淫巧

基数排序的奇技淫巧

算法数据结构中有哪些奇技淫巧?