zoukankan      html  css  js  c++  java
  • 位运算(2)

    1. 给定两个整数a,b。 问如何不用第三个变量,交换a b的值?

     解答:a  =  a^b;

       b = a^ b;

       a = a^b;

    2、给定 2 个32位 整数a和b ,返回其中较大的值,但是不能用任何比较运算。

      

    package Leet_Code;
    
    /**
    
     **/
    public class BitMax {
        public static int flip(int n){
            // n取0 或 1。若取其他数,则只会翻转最后一位。
            return n^1;
        }
    
        public static int sign(int n){
            // 取一个32位整数的符号
            // 此处用到了flip翻转操作。
            // 负数 1:  1-->0
            // 非负数: 0 : 0--->1
            return flip((n>>31) & 1);
        }
    
        public static int getMax(int a,int b){
            int c = a-b;
            int scA = sign(c);
            int scB = flip(scA);
            return a*scA + b*scB;
        }
    
        public static void main(String[] args) {
            System.out.println(getMax(3,9));
            System.out.println(getMax(3,-9));
            System.out.println(getMax(3,0));
            System.out.println(getMax(0,0));
        }
    
    }
    View Code

    但是,如果a-b溢出,则会出现计算错误。

    改进:如果a b同号,则绝对不会溢出,方法类似上边。如果 a  异号,则返回正的即可。代码综合起来。

     public static int getMax2(int a,int b){
            int c = a-b;
            int sa = sign(a);
            int sb = sign(b);
            int sc = sign(c);
    
            int difab = sa^sb;
            int sameab = flip(difab);
    
            int returnA = difab * sa + sameab * sc;
            int returnB = flip(returnA);
    
            return a*returnA + b*returnB;
    
        }
    View Code
  • 相关阅读:
    Finder 的分栏显示模式宽度调整
    IBAction作用相当于void,NSLog(@"被调用的方法名是%s",__func__);
    Trapping Rain Water
    Binary Tree Preorder Traversal
    Valid Parentheses
    Reverse Words in a String | LeetCode OJ | C++
    Gas Station|leetcode 贪心
    两个字符串“相等”
    Binary Tree Zigzag Level Order Traversal
    Add Binary
  • 原文地址:https://www.cnblogs.com/vector11248/p/10318611.html
Copyright © 2011-2022 走看看