最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用位運(yùn)算實(shí)現(xiàn)比較兩個(gè)數(shù)的大小

 更新時(shí)間:2022年08月31日 08:46:44   作者:Grey  
這篇文章主要為大家介紹了,在Java中如何不用任何比較判斷符(>,==,<),返回兩個(gè)數(shù)( 32 位整數(shù))中較大的數(shù),感興趣的可以了解一下

題目要求

如何不要用任何比較判斷符(>,==,<),返回兩個(gè)數(shù)( 32 位整數(shù))中較大的數(shù)。

主要思路

方法1(不考慮溢出)

要比較 a 和 b 的大小,因?yàn)椴荒苡帽容^符號(hào),我們可以通過(guò) a - b 的符號(hào)位來(lái)判斷,如果 a - b 的符號(hào)位是 1,說(shuō)明 a - b < 0,則 a 小,否則 a 大或者 a 和 b 相等。

如何判斷一個(gè)數(shù)的符號(hào)位是 0 還是 1 ?

由于是 32 位整數(shù),所以如果將一個(gè)數(shù)右移 31 位,然后和 1 相與(&),如果得到 1,則這個(gè)數(shù)是負(fù)數(shù),如果得到 0,則這個(gè)數(shù)是正數(shù)。

舉個(gè)具體例子,如果要求 a 和 b 誰(shuí)大,我們可以先通過(guò)

((a - b) >> 31) & 1 得到一個(gè)值,如果這個(gè)值是 1 ,說(shuō)明 a 小,否則 a 大或者 a 和 b 相等。

由于不能出現(xiàn)比較符號(hào),所以無(wú)法使用如下代碼

return ((a - b) >> 31) & 1 == 1?b:a;

也無(wú)法使用如下代碼

if (((a - b) >> 31) & 1 == 1){
    return b;
}
return a;

但是我們可以巧妙利用((a - b) >> 31) & 1結(jié)果去構(gòu)造一個(gè)公式,這個(gè)公式可以在((a - b) >> 31) & 1 == 1情況下得到 b, 在((a - b) >> 31) & 1 == 0情況下得到 a。

我們可以利用一個(gè)反轉(zhuǎn)函數(shù)

public int flip(int n) {
    return n ^ 1;
}

這個(gè)函數(shù)的作用就是,當(dāng)n == 1時(shí),返回 0,當(dāng)n == 0時(shí),返回 1,我們將判斷符號(hào)的結(jié)果flip一次,如下代碼

    public static int sign(int n) {
        return flip((n >> 31) & 1);
    }

這個(gè)方法的作用就是

當(dāng)符號(hào)位是 1 的時(shí)候,返回 0,符號(hào)位是 0 的時(shí)候,返回 1。

這樣flip后,

sign(a - b)如果得到 1, 則:a - b > 0,則返回 a。

sign(a - b)如果得到 0, 則:a - b <= 0,則返回 b。

公式可以定義成

sign(a - b) * a + flip(sign(a - b)) * b

主函數(shù)直接做如下調(diào)用

public static int getMax1(int a, int b) {
    int c = a - b;
    //當(dāng)符號(hào)位是 1 的時(shí)候,scA = 0,符號(hào)位是 0 的時(shí)候,scA = 1。
    int scA = sign(c);
    // scA = 1 時(shí),scB = 0,scA = 0時(shí),scB = 1
    int scB = flip(scA);
    // 如果 scA = 0,說(shuō)明 b 大,直接返回b
    // 如果 scA = 1,說(shuō)明 a 大,直接返回a
    return a * scA + b * scB;
}

這個(gè)方法沒(méi)有考慮溢出的情況,比如

a = 2147483647;
b = -2147480000;

a - b直接就溢出了,后面的算法就都不適用了。

方法2(考慮溢出情況)

那我們可以先比較 a 與 b 兩個(gè)數(shù)的符號(hào),

會(huì)有如下幾種情況:

情況1:符號(hào)不同,則直接返回符號(hào)為正的那個(gè)數(shù)。

情況2:如果符號(hào)相同,則這種情況下,a - b的值絕對(duì)不會(huì)溢出,那么就看 c 的符號(hào)(c為正返回a,c為負(fù)返回b)

方法2的核心代碼如下

int c = a - b;
int sa = sign(a);
int sb = sign(b);
int sc = sign(c);
int difSab = sa ^ sb;
int sameSab = flip(difSab);
int returnA = difSab * sa + sameSab * sc;
int returnB = flip(returnA);
return a * returnA + b * returnB;

其中: int difSab = sa ^ sb就是判斷 a 和 b 的符號(hào)是否一樣,如果 difSab == 1,則 a 和 b 符號(hào)一樣,如果difSab == 0,則a 和 b符號(hào)不一樣。

只有當(dāng)difSab == 0的時(shí)候,要考慮 c 的符號(hào)。因?yàn)?code>difSab == 0,所以int returnA = 0 * sa + 1 * sc;,即int returnA = sc,如果 sc 為 1,說(shuō)明 c 的符號(hào)是 0,則a - b > 0,返回 a 即可,否則返回 b。

方法1和方法2的完整代碼和測(cè)試代碼如下:

// 不要用任何比較判斷,返回兩個(gè)數(shù)中較大的數(shù)
public class Code_GetMax {

    public static int flip(int n) {
        return n ^ 1;
    }


    public static int sign(int n) {
        return flip((n >> 31) & 1);
    }

    public static int getMax1(int a, int b) {
        int c = a - b;
        int scA = sign(c);
        int scB = flip(scA);
        return a * scA + b * scB;
    }

    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 difSab = sa ^ sb;
        int sameSab = flip(difSab);
        int returnA = difSab * sa + sameSab * sc;
        int returnB = flip(returnA);
        return a * returnA + b * returnB;
    }

    public static void main(String[] args) {
        int a = -16;
        int b = -19;
        System.out.println(getMax1(a, b));
        System.out.println(getMax2(a, b));
        a = 2147483647;
        b = -2147480000;
        System.out.println(getMax1(a, b)); // wrong answer because of overflow
        System.out.println(getMax2(a, b));

    }
}

到此這篇關(guān)于Java利用位運(yùn)算實(shí)現(xiàn)比較兩個(gè)數(shù)的大小的文章就介紹到這了,更多相關(guān)Java位運(yùn)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus:xml拼接sql方式

    mybatis-plus:xml拼接sql方式

    這篇文章主要介紹了mybatis-plus:xml拼接sql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 1秒實(shí)現(xiàn)Springboot 圖片添加水印功能

    1秒實(shí)現(xiàn)Springboot 圖片添加水印功能

    這篇文章主要介紹了1秒實(shí)現(xiàn)Springboot 圖片添加水印功能,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • java字符串格式化(String類format方法)

    java字符串格式化(String類format方法)

    這篇文章主要介紹了java字符串格式化(String類format方法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java中的觀察者模式實(shí)例講解

    Java中的觀察者模式實(shí)例講解

    這篇文章主要介紹了Java中的觀察者模式實(shí)例講解,本文先是講解了觀察者模式的概念,然后以實(shí)例講解觀察者模式的實(shí)現(xiàn),以及給出了UML圖,需要的朋友可以參考下
    2014-12-12
  • Spring中實(shí)現(xiàn)定時(shí)調(diào)度的幾種方法

    Spring中實(shí)現(xiàn)定時(shí)調(diào)度的幾種方法

    本篇文章主要介紹了Spring中實(shí)現(xiàn)定時(shí)調(diào)度示例,可以在無(wú)人值守的時(shí)候系統(tǒng)可以在某一時(shí)刻執(zhí)行某些特定的功能,有興趣的可以了解一下。
    2017-02-02
  • 一次因Java應(yīng)用造成CPU過(guò)高的排查實(shí)踐過(guò)程

    一次因Java應(yīng)用造成CPU過(guò)高的排查實(shí)踐過(guò)程

    一個(gè)應(yīng)用占用CPU很高,除了確實(shí)是計(jì)算密集型應(yīng)用之外,通常原因都是出現(xiàn)了死循環(huán)。下面這篇文章主要給大家介紹了一次因Java應(yīng)用造成CPU過(guò)高的排查實(shí)踐過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • Java經(jīng)典排序算法之冒泡排序代碼實(shí)例

    Java經(jīng)典排序算法之冒泡排序代碼實(shí)例

    這篇文章主要介紹了Java經(jīng)典排序算法之冒泡排序代碼實(shí)例,相鄰兩元素進(jìn)行比較,如過(guò)左側(cè)元素大于右側(cè)元素,則進(jìn)行交換,每完成一次循環(huán)就將最大元素排在最后,下一次循環(huán)是將其它的數(shù)進(jìn)行類似操作,需要的朋友可以參考下
    2023-11-11
  • Springboot訪問(wèn)html頁(yè)面的教程詳解

    Springboot訪問(wèn)html頁(yè)面的教程詳解

    這篇文章主要介紹了Springboot訪問(wèn)html頁(yè)面的教程,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-03-03
  • SpringBoot整合ip2region獲取客戶端IP地理位置信息

    SpringBoot整合ip2region獲取客戶端IP地理位置信息

    在我們?nèi)粘EB開(kāi)發(fā)工作中,經(jīng)常會(huì)有需要獲取客戶端地理位置的需求,本文主要介紹了SpringBoot整合ip2region獲取客戶端IP地理位置信息,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • Spring?Bean后處理器詳細(xì)介紹

    Spring?Bean后處理器詳細(xì)介紹

    Bean后置處理器允許在調(diào)用初始化方法前后對(duì)Bean進(jìn)行額外的處理??梢栽?Spring容器通過(guò)插入一個(gè)或多個(gè)BeanPostProcessor的實(shí)現(xiàn)來(lái)完成實(shí)例化,配置和初始化一個(gè)?bean?之后實(shí)現(xiàn)一些自定義邏輯回調(diào)方法
    2023-01-01

最新評(píng)論

青浦区| 惠州市| 曲麻莱县| 瓦房店市| 湖南省| 保亭| 陆良县| 喜德县| 华宁县| 元阳县| 巴林右旗| 泰兴市| 电白县| 武隆县| 仁怀市| 宽甸| 凉城县| 沾化县| 江门市| 济宁市| 巴林右旗| 临泉县| 五莲县| 孟津县| 砀山县| 沙河市| 郸城县| 元江| 吉安县| 安徽省| 塔城市| 郁南县| 社旗县| 新余市| 南和县| 苏尼特右旗| 永仁县| 三穗县| 聊城市| 武隆县| 南宫市|