476 Number Complement
問題:給定一個整數(shù),返回它的補(bǔ)數(shù)。補(bǔ)數(shù)的是將原數(shù)據(jù)的二進(jìn)制表示反轉(zhuǎn)。例如 5 的二進(jìn)制位是 101,反轉(zhuǎn)之后是:010,也就是整數(shù)2。所以輸入5,返回2.。輸入1,返回0。
思路:取反操作是~,例如~5,但是5的最高位前面的0也會取反,0000 0000 0000 0101 會變成 1111 1111 1111 1010 ,而實(shí)際上,只有從右數(shù)的第三位是有效的,其他的1是無效的。按照461題目的思路,用一個字符串bit存儲二進(jìn)制位。
將 5和1與,得到1,bit=’0’;
5>>1,得到2,2&1,得到0 ,bit=’10’
2>>1,得到1,1&1,得到1,bit=’010’
1>>1 ,得到0,退出。
然后使用Integer.ValueOf 將一個二進(jìn)制字符串,轉(zhuǎn)為int。
收獲:
1 Integer.highestOneBit(num) 返回的是 num二進(jìn)制中最高位的1,所表示的int數(shù)字。例如5的二進(jìn)制 0000 0000 0000 0101 ,最高位的1表示4。
2 我的思路是一位一位取反,數(shù)字為0就退出了。另外一種思路是對 ~num 后無效的1 取一個&操作,將其去掉。如果有這樣一個數(shù):沒有意義的位上是0,有意義的位上全是1,然后與~num 做&操作,那么就可以得到正確結(jié)果。對5來講,需要一個這樣的數(shù):0000 0000 0000 0111。這個數(shù)等于(Integer.highestOneBit(5)<<1)-1,也就是(4<<2)-1=7。最終:~num & ((Integer.highestOneBit(num)<<1) - 1).
再進(jìn)一步:第三位的1(從右開始數(shù)),肯定會變成0,所以 0000 0000 0000 0011這樣一個數(shù)也是可以的。最終:~num & (Integer.highestOneBit(num) - 1)。
3 掩碼: 0000 0000 0000 0011 這樣的數(shù)字叫做掩碼。掩碼是一串二進(jìn)制代碼,對目標(biāo)字段進(jìn)行位與的操作與運(yùn)算,屏蔽當(dāng)前的輸入位。 將源碼與掩碼經(jīng)過按位運(yùn)算或邏輯運(yùn)算得出新的操作數(shù)。其中要用到按位運(yùn)算如OR運(yùn)算和AND運(yùn)算。例如:大寫字母轉(zhuǎn)小寫字母,IP地址的掩碼。
參考:
1 leetcode題目
2 leetcode討論
總結(jié)
以上是生活随笔為你收集整理的476 Number Complement的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [hackinglab][CTF][注入
- 下一篇: android开发(49) androi