1.LeetCode第二天
感觉工作以来,很久没有学过英语了。语言这种东西呢,不用自然就生疏了,所以,早上开始背背单词,还挺好的。昨晚还下了一个app,交互十分可爱,一天学习5分钟,学习一些基本的单词还是可以的(APP:drop)
开始今天的题目:
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)
---------------------------------------------------------------------我是分割线----------------------------------------------------------------------------------------------------------
由题可知:hamming distance就是两个整数转化为二进制后,每一位不相同的个数总和。
解放方法:利用位运算的方式。
class Solution {
public:
int hammingDistance(int x, int y) {
int dist = 0, n = x ^ y;
while (n) {
++dist;
n &= n - 1;
}
return dist;
}
};
-----------------------------------------------------------------我是分割线------------------------------------------------------------------------------------------------------------
此处为位运算的回顾:
1.与运算:&
2.或运算:|
3.异或运算:^
常用于定位转换:a=0001 ^a=1110
数值转换:a=3,b=4;不需引入第三个数,将数值转换:a=a^b;b=b^a;a=a^b
4.位移运算符
a.位左移:对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃
由于位移操作的运算速度比乘法的运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。
提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率
b.位右移:将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。如果当前的数据为有符号数,在进行右移的时候,根据符号 位决定左边补0还是补1。如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。
c.复合位运算符:在C语言中还提供复合的位运算符,如:&=、!=、>>=、<<=和^=。