c语言位运算

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

按位异或:

若两个数对应的位相反(即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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值