分享一波:程序員賺外快-必看的巔峰干貨
前言
今天在水群的過程中看到有位群員談論到這個話題,是他找工作過程中某家公司的面試題(到底是哪家公司才會出這種沒營養的題目刁難別人),有點興趣,就開始寫了。
開搞
想了一下,其實就是題目怪了一點,難度其實并不高。這個題目讓我想起了前兩年看到的題目,只給你加法,怎么計算加減乘除(都說了到底是哪家公司才會出這種沒營養的題目)。相比起來,這題好歹是考了計算機中的加法器,而本文主題中談論的題目則真的是毫無營養。
思路其實很明顯,位運算,這類題目一般都是要用位運算的。這里需要使用到無符號右移。
首先,既然不允許直接比較,那我就相減嘛,a-b結果是0就是相等,結果是負數就是a小,結果是正數那就是a大。
當然這里是不能直接比較結果的正負的, 這樣依然不符合提議,怎么辦呢。
一切的運算在計算機中都是二進制,數字也是用二進制表示的,而二進制表示數字的時候,最高位是代表符號位,1是負數,0是正數,傳統的int最高32位。因此我們只需要判斷第32位的結果是0還是1就能判斷誰大誰小。直接判斷第32位肯定不現實,這里就需要使用到無符號右移運算符“>>>”。舉個簡單的例子,下面這串二進制只需要無符號右移31位,就可以得到最高位的值
1000 0010 1101 0100 1101 0001 0010 0011
無符號右移31位后
0000 0000 0000 0000 0000 0000 0000 0001
結果顯而易見,最高位降到了最低位,其余位全部變成了0,因此,只要結果是負數,那么進行 >>>31 之后的結果轉為十進制就是1,否則為0。
int a = 10;int b = 12;int index = (a - b) >>> 31;
這樣,我們只需要判斷index即可。
那么問題來了,題目要求是不允許判斷,該怎么辦呢?其實這里可以使用數組,下標為0的地方輸出a>=b,為1的地方輸出a<b。
完整代碼:
public void test() {int a = 10;int b = 12;int index = (a - b) >>> 31;String[] arr = {"a>=b", "a<b"};System.out.println(arr[index]);
}
至此,已經基本可以判斷a和b的大小了。但是到這里可以發現,a=b和a>b的情況無法分離,這里我們可以繼續思考。
當a=b時,a-b=0,那么數組0下標位置是否可以直接放a=b?接著,我們把上面的index+1,結果就變成了:1下標位置是大于等于,2下標位置是小于。其中,等于的情況已經在0下標位置,因此1下標位置的結果就是a>b了。
String[] arr = {“a=b”, “a>b”, “a<b”};
分析到這里,思路已經很清晰,首先我們計算a-b,直接作為下標取arr中的數據,如果報錯了,說明不是0、1、2的情況,那么就繼續按照上面的思路進行位運算,取出1和2下標的值 。
public void test() {int a = 13;int b = 12;int diff = a - b;String[] arr = {"a=b", "a>b", "a<b"};try {System.out.println(arr[diff]);} catch (ArrayIndexOutOfBoundsException e) {int index = diff >>> 31;System.out.println(arr[index + 1]);}
}
到了這里,程序還存在一個bug,當a-b=2時,該程序的判斷結果是有問題的,因此,我們需要把計算結果為2的情況給排除,做法很簡單,把diff這個變量進行有符號左移2位的操作即可(如果只移1位,當diff為1時,計算結果是2,不符合題意)。左移2位之后的結果絕對值肯定比2要大,因此也就杜絕了出現下標為2的情況。
最終代碼。
public void test() {
int a = 14;
int b = 12;
int diff = (a - b) << 2;
String[] arr = {“a=b”, “a>b”, “a<b”};
try {
System.out.println(arr[diff]);
} catch (ArrayIndexOutOfBoundsException e) {
int index = diff >>> 31;
System.out.println(arr[index + 1]);
}
}
最后還是要吐槽一句,沒事別出這種沒營養的面試題刁難人家啦!
*************************************優雅的分割線 **********************************
分享一波:程序員賺外快-必看的巔峰干貨
如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程
請關注微信公眾號:HB荷包
一個能讓你學習技術和賺錢方法的公眾號,持續更新