欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言位运算

程序员文章站 2022-07-15 08:52:17
...

位运算有按位异或,按位与,按位或,按位取反,位移这几种,位运算都要转换成二进制来操作

按位异或:

若两个数对应的位相反(即1和0),得1

1010

     1001

得  0011

按位与:

若两个数对应的位都为1,得1

如   1010

       1001

得    1000

按位或:

若两个数对应的位只要有一个为1,得1

如   1010

       1001

得    1011

按位取反

把这个数的1变成0,0变成1

如   1010

得    0101

这样子看起来似乎得到的是5(0101转10进制是5),然而并不是,一个int类型的是32位,这里我们只是看到了这个数的后四位,前面还有28位0,这28个0在取反的时候都变成了1,即0000000000000000000000000001010变成1111111111111111111111111111011,所以最终得到的是-11.而之前的位运算都是两个数在比较,所以就不会把前面的0进行变换。

位移:

向左移3位:

把这个数的左边的3个数去掉,右边补0。

0001010

1010000

向右移三位:

把这个数右边的三个数去掉,左边补0

如 0001010

得 0000001

代码:

#include <stdio.h>
/*
 *按位异或(看两个数的二进制对应的位上是否相反)
 *如 1010 10
 *   1001 9
 *得 0011 3
*/
int wei1(int a,int b){
	return a ^ b;
}

/*
 *按位与(看两个数的二进制对应的位上是否都为1)
 *如 1010 10
 *   1001 9
 *得 1000 8
*/
int wei2(int a,int b){
	return a & b;
}

/*
 *按位或(看两个数的二进制对应的位上是否有一个为1)
 *如 1010 10
 *   1001 9
 *得 1011 11
*/
int wei3(int a,int b){
	return a | b;
}

/*
 *按位取反(把这个数的二进制的1变成0,0变成1)
 *如 1010 10
 *得 0101 -11
 *因为int类型的位是32位,这里只操作了后四位,前面还有28个0,全部变成了1,就得到了-11
*/
int wei4(int a){
	return ~a;
}
/*
 *按位取反
 *这次是字符,字符只占8个位
 *如 00001010 10
 *得 11110101 245
*/
unsigned char wei5(unsigned char a){
	return ~a;
}

/*
 *位移,向左移n位,
 *如 n=3
 *   0001010 10
 *得 1010000 80
*/
int move1(int a,int n){
	return a << n;
}

/*
 *位移,向右移n位,
 *如 n=3
 *   0001010 10
 *得 0000001 1
*/
int move2(int a,int n){
	return a >> n;
}

void main(){
	printf("按位异或:%d\n",wei1(10,9));
	printf("按位与:%d\n",wei2(10,9));
	printf("按位或:%d\n",wei3(10,9));
	printf("按位取反(int):%d\n",wei4(10));
	printf("按位取反(char):%d\n",wei5(10));

	printf("位移,向左移3位:%d\n",move1(10,3));
	printf("位移,向右移3位:%d\n",move2(10,3));
	getchar();
}

 

相关标签: 位运算