位运算.cpp

/*位运算
*位都有编号,从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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值