016-C语言中的位运算符和移位运算符

#include<iostream>
#include<stdlib.h>
using namespace std;

int main(int argc, char const *argv[])
{
  
  // 位运算
  // 按位与运算符 &  只有都为真的情况下才会是1 其余是0
  // 按位或运算符 | 
  // a= 5(00000101) b=9(00001001)
  unsigned char a = 5, b =  9;
  
  //结果是 000000001
  printf("a=%d, b=%d\n", a, b);
  printf("a&b=%d\n", a&b);
  
  //结果是 00001101 只要有1则是1 否则都是0
  printf("a|b=%d\n", a|b);
  
  //结果是 00001100 相同为0 不同为1
  printf("a^b=%d\n", a^b);
  
  //结果是 11111010 
  printf("~a=%d\n", ~a);
  
  //移位运算 左移一位表示左操作数乘以2^1  右移一位表示左操作数除以2^1
  //左移1位 00010010 2^4+2^1 = 16+2 = 18 
  printf("b<<1=%d\n", b<<1);
  //右移1位 00000100 2^2 = 4
  printf("b>>1=%d\n", b>>1);

  // 掩码
  // 如果要对一个整数中的某些位进行操作,怎么表示这些未在整数中的位置,可以利用掩码(Mask)来进行,
  // 比如掩码0x0000ff00表示对一个32整数的8~15位进行操作
  
  //1. 取出8-15位
  unsigned int a1, b1, mask = 0x0000ff00;
  //16进制中2个数字代表一个字节,也就是8位,所以取出8-15位为就是取出56这两个数字
  a1 = 0x12345678;
  b1 = (a1 & mask) >>8;//
  printf("b1=%x\n", b1); //0x56

  //2. 将8~15位清0
  unsigned int a2, b2, mask2 = 0x0000ff00;
  a2 = 0x12345678;
  b2 = a2 & ~mask2; 
  printf("b2=%x\n", b2); // 12340078

  //3. 将8~15位置为1
  unsigned int a3, b3, mask3 = 0x0000ff00;
  a3 = 0x12345678;  
  b3 = a3 | mask3;
  printf("b3=%x\n", b3); //1234ff78

  // 异或运算的一些特性
  //1. 一个数和自己做异或的结果是0
  unsigned int a4 = 10;
  printf("a4=%d\n", (a4^a4)); // 0

  //2. 从异或的真值表可以看出,不管是0还是1,和0做异或值不变,
  //和1做异或得到原值的相反值。可以利用这个特性配合掩码实现某些位的翻转,
  unsigned int a5, b5, mask5 = 1 <<6;
  a5 = 0x12345678;
  b5 = a5 ^ mask5;
  printf("b5=%x\n", b5);

  //3. x^x^y==y, 因为x^x==0, 0^y==y
  // 这个性质可以交换两个变量,不用借助额外的存储空间,所以就不需要采用 temp = a; a=b; b=temp
  // 利用一下方法就可以进行交换
  // a = a ^ b;  a= a0 ^ b0
  // b = b ^ a;  b= b ^ a = b0 ^ a0 ^ b0 = b0^b0 ^ a0 ==> a0
  // a = a ^ b;  a= a ^ b = a0^b0^a0 = b0
  // 由此可见,两个数字 a, b 数值进行了交换

  //int a6 = 6, b6 = 4;
  //int c = b6 ^ a6 ^ b6;
  //a6^a6^b6 == a6^b6^a6 true
  int a6 = 6, b6 = 4;
  a6 = a6^b6;
  b6 = b6^a6;
  a6 = a6^b6;
  printf("a6=%d, b6=%d\n", a6, b6); // 4, 6

  // 取出一个整数的二进制形式中的指定位置的数字 
  // 比如 10 (00001010)
  int a7 = 10;
  // 取出10的二进制数中倒数第3位的数字(下标从第0为开始算)
  int result = (a7>>3) & 1;
  printf("result %d\n", result); //1 
  return 0;
}

输出如下:

a=5, b=9
a&b=1
a|b=13
a^b=12
~a=-6
b<<1=18
b>>1=4
b1=56
b2=12340078
b3=1234ff78
a4=0
b5=12345638
a6=4, b6=6
result 1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值