位运算——

位运算

  1. 左移 n位,×2^n

    • 操作数<<位数
    • 左边的操作数转为二进制,左边最高位丢弃,右边补0
  2. 右移 n位,/2^n

    • 操作数>>位数
    • 右移指定位数,最高位是0,左边补0,最高位1,左边补1
  3. 无符号右移

    • 操作数>>>位数
    • 右移指定位数,最高位无论0还是1,统一补0
  4. 负数右移,让补码右移,再转成源码

位运算奇偶判断

  • 让这个数和1相与
  • 6 & 1 = 0 偶数
  • 7 & 1 = 1 奇数

位运算两数交换

  • 一个数对自己异或一次,在和另一个数异或
    • a = 2 b = 5
    • a = a ^ b
    • b = b ^ a
    • a = a ^ b

位运算两数相加

  1. 不考虑进位 可用位运算逻辑^异或代替

    1 + 1 = 0	
    
    1 + 0 = 1
    
    0 + 1 = 1
    
    0 + 0 = 0
    
    
    
    1 ^ 1 = 0
    
    1 ^ 0 = 1
    
    0 ^ 1 = 1
    
    0 ^ 0 = 0
    
  2. 考虑进位 可用位运算按位与&代替

    1 + 1 = 1	//进位
    
    1 + 0 = 0
    
    0 + 1 = 0
    
    0 + 0 = 0
      
    1 & 1 = 1//进位
    
    1 & 0 = 0
    
    0 & 1 = 0
    
    0 & 0 = 0
    
  3. 例:11 + 01 = 100

    11 ^ 01 = 10 //算出本位和
      
    (11 & 01) << 1 = 10 //算出进位
      
    //重复上次计算直至进位为0
    10 ^ 10 = 00 
      
    (10 & 10) << 1 = 100
    
    00 ^ 100 = 100
      
    (00 & 100) << 1 = 0//不再进位,得到100
    
  4. 代码实现

int sum(int a, int b) {
  int sum = a ^ b;
  int carry = a & b;
  while(carry) {
    int t_s = s;
    int t_c = carry << 1;
    s = t_s ^ t_c;
    carry = t_s & t_c;
  }
  return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值