位操作的相关指令

位操作的相关指令


#include "stdafx.h"


//打印二进制的函数
void binDis(int data)
{
	int i = 32;//表示打印32位的二进制数
	while (i--)
	{
		if (data &(1 << i))
			printf("1");
		else
			printf("0");
		if (i % 8 == 0)
			putchar(' '); //每打印8位空一个格
	}
	putchar(10);
}


int _tmain(int argc, _TCHAR* argv[])
{

#if 0

----位与(&)
	1.按位与 :&
	2.格式 :x&y
	3.规则 :对应位均为 1 时才为 1,否则为 0
	4.结论 :同1位与保持不变,同0位与清零,
	在某些位保持不变的情况下,某些位清零

	//int a = 1;
	//binDis(a);
	//int b = a << 1;//a的二进制数中全部左移一位
	//binDis(b);
	//int c = a&b;//位上都为1才得1
	//binDis(c);
	int x = 0x55;
	int y = 0xf0;
	binDis(x); binDis(y); binDis(x&y);


----位或(|)
	1.按位或 :|
	2.格式 :x|y
	3.规则 :对应位均为 0 时才为 0 ,否则为 1
	4.结论 :与0位或保持不变,与1位或置1
	某些位保持不变的情况下,某些位置1

	//int a = 3;
	//int b = 9;
	//int c = a|b;
	//binDis(a);
	//binDis(b);
	//binDis(c);
	int x = 0xaa;   //1010 1010
	int y = 0xf0;
	binDis(x); binDis(y); binDis(x | y);


----位取反(~)
	1.按位求反:~
	2.格式 :~ y
	3.规则 :各位翻转,即原来为 1 的位变成 0,原来为 0 的置 1

	int a = 1;
	int b = ~a;  printf("b = %d\n", b);
	binDis(1 << 31);//将值为1的二进制位向左移31个单位,也就是移到位首
	binDis(~(1 << 31));//将其取反相当于首位是0其余位都是1,也就是int类型的整数中最大的数
	printf("%d", ~(1 << 31));//打印出int类型中最大的整数


----位异或(^)
	1.按位异或:^
	2.格式 :x^y
	3.规则 :对应相同时 0 ,不同时则为 1
	4.结论 :在某些位保持不变的情况下,将某些位取反。

	//int a = 3;
	//int b = 9;
	//int c = a^b;
	//binDis(a);binDis(b);binDis(c);

	int x = 0xa5;     //1010 0101
	int y = 0xf0;
	binDis(x); binDis(y); binDis(x^y);


----左移(<<)
	1.按位左移:<<
	2.格式 :x<<位数(非负整数)
	3.规则 :使操作数的各位左移,低位补 0,高位溢出。
	4.例如 : 5 << 2 = 20:0101 → 10100

	int a = 0xff;
	//binDis(a);
	//binDis(a<<31);
	
	//for(int i=0; i<10; i++)
	//{
	//    printf("%d\n",1<<i);
	      小值往左移动一位数值扩大二倍
		  相反,大值往右移动一位数值缩小二倍					
	//}

	a = a << 28; //左移过程中 右侧补零  左侧溢出,舍掉。
	binDis(a);


----右移(>>)
	1.按位右移:>>
	2.格式 :x >>位数(非负整数)
	3.规则 :使操作数的各位右移,移出的低位舍弃;
	4.高位 :对无符号数和有符号中的正数补 0;符号数中的负数取决于
	所使用的系统  补 0 的称为“逻辑右移”,补 1 的称为“算术右移”。
	5.说明 :x、y 和“位数”等操作数,都只能是整型(允许字符型数据)。
	6.例如 : 5 << 2 = 20 s:0101 → 10100,
			  20 >> 2 = 5 :10100 → 00101

#endif
	
	//int a = 0xf1;  //有符中的正数 
	//binDis(a);
	//a = a>>1;
	//binDis(a);

	//unsigned int b = 1<<31; //无符号数
	//binDis(b);
	//b = b>>1;
	//binDis(b);

	int c = 1 << 31 | 1;
	binDis(c);
	c = c >> 1;
	binDis(c);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值