位操作的相关指令
#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;
}