/*位运算
*位都有编号,从0开始;
*(高<-)7 6 5 4 3 2 1 0(->低)
*位是最小的数据单元,只能保存一个二进制数据(0或1),八个为一个字节,即char型占8位,int型占32位,double占64位,64位机一个指令周期可处理64个位,所以64为指针占8个字节,一个二进制占1位,八进制占三位,十六进制占四位
*/
# include <iostream>
using namespace std;
int main()
{
union A
{
int x; //占32位
char y[4];
};
union A a;
a.x = 0x12345678;//八位16进制数,占32位:0B 0001 0010 0011 0100 0101 0110 0111 1000
for (int i = 0; i< 4;i++){
printf ("y[%d] : %x\n",i,a.y[i]); //这里最好用printf可以强制转换格式,x为16进制数
}
printf("a = 0x%x\n",a.x);
int b1,b2,b3,b4,b5,b6;
int c1,c2,c3;
// | 位运算或 按位取或,有1则1,无1则0
#if 0
b1 = a.x| 0B11111111111111111111111111111111; //按位操作指二进制位,实际使用中以16进制表示
#else
b1 = a.x|0xffffffff;
#endif
printf ("b1 = 0x%x\n",b1); //0x 1111 1111 1111 1111 1111 1111 1111 1111= ffffffff
#if 0
b2 = a.x| 0B000000000000000000000000000000000;
#else
b2 = a.x|0x00000000;
#endif
printf ("b2 = 0x%x\n",b2);
#if 1
// & 位运算与 按位取与,有1则1,无1则0
b3 = a.x& 0B11111111111111111111111111111111;
#else
b3 = a.x& 0xffffffff;
#endif
printf ("b3 = 0x%x\n",b3);
// ~ 位运算取反 按位取反,见1写0 见0写1
b4 = ~a.x;
//x = 0B 0001 0010 0011 0100 0101 0110 0111 1000
printf ("b4 = 0x%x\n",b4); //b = 0B 1110 1101 1100 1011 1010 1001 1000 0111 = 0xedcba987
// ^ 位运异或 相同写0 不同写1
#if 1
b5 = a.x^0B000000000000000000000000000000000;
#else
b5 = a.x^0x00000000;
//x = 0B 0001 0010 0011 0100 0101 0110 0111 1000
#endif
printf ("b5 = 0x%x\n",b5); //b = 0B 0001 0010 0011 0100 0101 0110 0111 0000
#if 1
b6 = a.x^0B11111111111111111111111111111111;
#else
b6 = a.x^0xffffffff;
//x = 0B 0001 0010 0011 0100 0101 0110 0111 1000
#endif
printf ("b6 = 0x%x\n",b6); //b = 0B 1110 1101 1100 1011 1010 1001 1000 0111 = 0xedcba987
//>> 位运算右移,左侧空缺补符号位
c1 = a.x >> 1;
//x = 0B 0001 0010 0011 0100 0101 0110 0111 1000
printf ("c1 = 0x%x\n",c1); //c = 0B 0000 1001 0001 1010 0010 1011 0011 1100 = 0x091a2b3c
// << 位运算左移,右侧空缺补0
c2 = a.x << 2;
//x = 0B 0001 0010 0011 0100 0101 0110 0111 1000
printf ("c2 = 0x%x\n",c2); //c = 0B 0100 1000 1101 0001 0101 1001 1110 0000 = 0x48d159e0
//将a的高8位和低8位置0
#if 0
c3 = a.x & 0B00000000111111111111111100000000;
#else
c3 = a.x &0x00ffff00;
#endif
printf ("c3 = 0x%x\n",c3);
/*
* 子网掩码必须和IP地址同时使用,取与用于表征该主机属于哪个局域网
IP = 192.168.0.1; = 0B111111111 1011000 00000000 000000001
ask = 255.255.255.0; = 0B11111111111111111111111100000000
*/
int IP = 0B11111111101100000000000000000001;
int mask = 0B11111111111111111111111111111111;
unsigned LAN = IP&mask;
printf ("LAN : %u\n",LAN);
}