LeetCode(一)--461.Hamming Distance&476.Number Complementビット演算


Hamming Distance
タイトルの要求は次の通りです.The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x and y, calculate the Hamming distance.
Note: 0 ≤ x, y < 231.
Example:
Input: x = 1, y = 4
Output: 2
Explanation:
  • 1 (0 0 0 1) 4 (0 1 0 0)

  • The above arrows point to positions where the corresponding bits are different.
    問題の解き方は次の通りです.
    public class Solution {
        public int hammingDistance(int x, int y) {
            int diff=x^y;//   
            int count=0;
           while (diff != 0) {  
                 count++;  
                diff = diff & (diff - 1); 
                //   1   
            }  
            return count;
    
        }
    }

    Number Complement
    タイトルの要求は以下の通りです.
    Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
    Note: The given integer is guaranteed to fit within the range of a 32-bit signed integer. You could assume no leading zero bit in the integer’s binary representation.
    Example 1: Input: 5 Output: 2 Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
    Example 2:Input: 1 Output: 0 Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
    問題の解き方は次の通りです.
    public class Solution {
        public int findComplement(int num) {
            int temp = num, mask = 1;
            while(temp != 0) {
                temp = temp >> 1;//  
                mask = mask << 1;//  
            }
            return num ^ (mask - 1);
        }
        //mask - 1  num            1  ,
        // num ^     num         
    
    }

    解法もある
    public class Solution {
        public int findComplement(int num) {
            return ~num & ((Integer.highestOneBit(num) << 1) - 1);
            //highestOneBit num                2 N  
            //     1     0  num      
        }
    }

    位置演算に関して、多くの技巧があって、20個のビット演算技巧のビット演算の紹介と技巧の基礎の編位演算の紹介と技巧の進級編のビット演算の紹介と技巧の進級編の2ビット演算の紹介と技巧の実戦編を参考することができますhttps://discuss.leetcode.com/topic/50315/a-summary-how-to-use-bit-manipulation-to-solve-problems-easily-and-efficiently https://discuss.leetcode.com/topic/49771/java-simple-easy-understand-solution-with-explanation