位运算的奇技淫巧
Posted ~千里之行,始于足下~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算的奇技淫巧相关的知识,希望对你有一定的参考价值。
左移操作符 移位规则:
左边抛弃、右边补0
右移操作符 移位规则:
- 逻辑移位 左边用0填充,右边丢弃(无符号数)
- 算术移位 左边用原该值的符号位填充,右边丢弃(有符号数)
注:对于移位运算符,不要移动负数位
//求一个整数存储在内存中二进制中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;
}
未完,代结~~。
以上是关于位运算的奇技淫巧的主要内容,如果未能解决你的问题,请参考以下文章