日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

476 Number Complement

發(fā)布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 476 Number Complement 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

 問題:給定一個整數(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。

public int findComplement(int num) {String bit = "";while (num != 0) {bit = ((num & 1) == 1 ? 0 : 1) + bit;num >>= 1;}return Integer.valueOf(bit, 2);}

  收獲:
  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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。