c语言位运算

起因


最近在看wrk(压力测试工具)源码,发现里面使用很多的位运算,这是在工作上很少用到的.位运算是二进制计算的.使用位运算性能会好一些.
位运算主要是包括:
  1. 与(&)
  2. 或(|)
  3. 非(~)
  4. 异或(^)
  5. 左移(<<)
  6. 右移(>>)
 

1. 与 (&) 真真为真,余为假

0001    //1为真 0为假
0010    //
--------
0000    //值为0

1. 代码

#include <stdio.h>
#include <stdlib.h>

//位运算 与(&)

int main(int argc,char* argv[])
{
	int a = 1;
	int b = 2;
	int c = a & b;
	printf("a&b=%d\n",c);
	return 0;
}

逻辑与

2.或(|) 假假为假,余为真

//计算 1|2 值
//二进制换算
0001
0010
-------
0011   //十进制值为3

2. 代码

#include <stdio.h>
#include <stdlib.h>

//位运算 或(|)

int main(int argc,char* argv[])
{
	int a = 1;
	int b = 2;
	int c = a | b;
	printf("a|b=%d\n",c);
	return 0;
}

逻辑或

3. 非(~) 按位取反

//计算 ~1 值
//涉及到补码,这里不详细说,公式计算 -(x+1) 
-(1+1)  //取反值为:-2

代码

#include <stdio.h>
#include <stdlib.h>


int main(int argc,char* argv[])
{
	int a = ~1;
	printf("%d\n", a);
	return 0;
}

逻辑非

4. 异或 (^)  真真为假,假假为假,余为真

//计算 1 ^ b
0001
0010
-------
0011   //十进制为3

4.代码

#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { int a = 1; int b = 2; int c = a ^ b; printf("a^b=%d\n",c); return 0; }
逻辑异或

5. 左移 <<

//计算 1 左移1 
0001 
-------
0010   //十进制为2

5. 代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
	int a = 1;
	int b = a << 1;
	int c = a << 2;
	int d = a << 3;
	printf("b=%d\n", b);  //左移1位
	printf("c=%d\n", c);  //左移2位
	printf("d=%d\n", d);  //左移3位
	return 0;
}

左移

6. 右移 >>

//计算 8 右移1位
1000
-------
0100    //十进制为4

6. 代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
	int a = 8;
	int b = a >> 1;
	printf("b=%d\n", b);  //右移1位
	return 0;
}

右移

秋风 2018-04-14