476. Number Complement

来源:互联网 发布:js面向对象 阮一峰 编辑:程序博客网 时间:2024/05/22 09:54

问题描述:将一个int型的正整数2进制形式逐位取反。
思路:逐位取反通过异或即可实现,所以构建一串二进制全是1的数据取异或即可。
原答案:

    public int findComplement(int num) {        int leadZero=Integer.numberOfLeadingZeros(num);        int count=1<<(32-leadZero);        int i=count-1;        return i^num;    }

基本与最佳答案一致,但如下答案似乎更好

    public int findComplement(int num) {        int mask = num;        mask |= mask >> 1;        mask |= mask >> 2;        mask |= mask >> 4;        mask |= mask >> 8;        mask |= mask >> 16;        return num ^ mask;

与java源码中highestOneBit方法类似。先将数字转化成从最高位开始全为1的数字,然后异或得出答案。
highestOneBit(i)代码品读

原创粉丝点击