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