江苏网站seo设计,什么学习网站建设,栾城做网站,运城建设银行网站点问题#xff1a;给定一个整数#xff0c;返回它的补数。补数的是将原数据的二进制表示反转。例如 5 的二进制位是 101#xff0c;反转之后是#xff1a;010#xff0c;也就是整数2。所以输入5#xff0c;返回2.。输入1#xff0c;返回0。 思路#xff1a;取反操作是… 问题给定一个整数返回它的补数。补数的是将原数据的二进制表示反转。例如 5 的二进制位是 101反转之后是010也就是整数2。所以输入5返回2.。输入1返回0。 思路取反操作是~例如~5但是5的最高位前面的0也会取反0000 0000 0000 0101 会变成 1111 1111 1111 1010 而实际上只有从右数的第三位是有效的其他的1是无效的。按照461题目的思路用一个字符串bit存储二进制位。 将 5和1与得到1bit’0’ 51得到221得到0 bit’10’ 21得到1,11得到1bit’010’ 11 得到0退出。 然后使用Integer.ValueOf 将一个二进制字符串转为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二进制中最高位的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也就是(42)-17。最终~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讨论