位运算

位运算

1、按位取反 ~(你真我假)

void test01()
{
	int num = 2;

	// 010 取反
	// 101 源码
	//计算机用补码方式存数据  110 + 1      =  111

	printf("~num = %d\n", ~num); // -3

}

2、 按位与&(全真为真,有假为假)

一个数与1按位与(&)结果为1,则此数为奇数,否则为偶数

01010101    

00000001 &

00000001  奇数
01010100    

00000001 &

00000000  偶数
void test02()
{
	int num = 123;
	if (  (num & 1 ) == 1 )
	{
		printf("num为奇数\n");
	}
	else
	{
		printf("num为偶数\n");
	}

}

3、按位或 | (全假为假,有真为真)

按位或(|)可将指定位置为 1

00100001
10001000  |
10101001
void test03()
{
	int num1 = 5;
	int num2 = 3;
	printf("num1 | num2 =  %d\n", num1 | num2); // 7

}

4、按位异或 ^(相同为假,不同为真)

可实现两个数交换

A ^ B = R
A ^ R = B
B ^ R = A
void test04()
{
	int num1 = 5;
	int num2 = 9;

	//int tmp = num1;     //1、两个数交换
	//num1 = num2;
	//num2 = tmp;

	num1 = num1 ^ num2;    //2、两个数交换
	num2 = num1 ^ num2;
	num1 = num1 ^ num2;


	//num1 = num1 + num2;  //3、两个数交换
	//num2 = num1 - num2;  
	//num1 = num1 - num2;


	printf("num1 = %d\n", num1);
	printf("num2 = %d\n", num2);

}

5、左移运算 <<

将一个运算对象的各位二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

A=0011 1100

A<<2 -----> 1111 0000

左移X位代表乘以2^X次方次幂

void test05()
{
	int num = 20;  // 20 * 2 ^ 2;
	printf("%d\n", num <<= 2);
}

6、右移运算>>

将一个运算对象的各位二进制位全部左移若干位(正数左边补0,复述左边补1,右边丢弃)

A=0011 1100

A>>2 -----> 0000 1100

左移X位代除以2的X次幂

void test06()
{
	int num = 20;  // 20 / 2
	printf("%d\n", num >>= 1);
}
#include <stdio.h>
 
int main()
{
 
   unsigned int a = 60;    /* 60 = 0011 1100 */  
   unsigned int b = 13;    /* 13 = 0000 1101 */
   int c = 0;           
 
   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - c 的值是 %d\n", c );
 
   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - c 的值是 %d\n", c );
 
   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - c 的值是 %d\n", c );
 
   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - c 的值是 %d\n", c );
 
   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - c 的值是 %d\n", c );
 
   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - c 的值是 %d\n", c );
}

运行结果:

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值