python位运算符:python的位运算符是把数字看作二进制来进行计算的。
按位与(&):如果两个二进位都为1,则该位结果为1,否则为0
按位或(|):只要一个为1,则为1,否则为0
按位异或(^):两个二进位相异为为1(即两个二进位要相反),否则为0
取反(~):对数据的每个二进制位取反,即把1变0,把0变1
左移动:运算数的各二进位全部向左移若干位
右移动:运算数的各二进位全部向右移若干位
其中,c++语言中,对于左右移动,在左移n位的时候,最左边n位被遗弃,同时右边布上n个0;右移n位的时候复杂一点,如果数字是一个无符号数值,则用0补上左边的n位,如果数字是一个有符号数值,则用数值的符号为填充左边的n位,也就是说,正数就填充0,负数就填充1
下面看题目:
题目一:
输入一个整数,输出该数二进制表示中1的个数。
public class Solution { public int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n = n & (n - 1); } return count; } } #把一个整数减去1,再和原来的数做与运算,就会把该整数最右边的1变成0
结论一:把一个整数减去1,再和原来的数做与运算,就会把该整数最右边的1变成0
题目二:
用一条语句判断一个整数是不是2的整数次方。
结论2:一个整数如果是2的整数次方,那么他的二进制表示中有且只有一位是1,其他位都是0.根据前面的分析,把这个数减去1之后再和他自己做与运算,这个整数中唯一的1就会变成0.
题目三:
输入整数m和n,计算需要改变m的二进制表示中多少位才能得到n。
结论:第一步求这两个数的异或运算,第二步,统计异或结果的二进制表示中1的个数
题目四:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
结论四:
此题考察的是异或运算的特点:即两个相同的数异或结果为0。
此题用了两次异或运算特点:
(1)第一次使用异或运算,得到了两个只出现一次的数相异或的结果。
(2)因为两个只出现一次的数肯定不同,即他们的异或结果一定不为0,一定有一个位上有1。另外一个此位上没有1,我们可以根据此位上是否有1,将整个数组重新划分成两部分,一部分此位上一定有1,另一部分此位上一定没有1,然后分别对每部分求异或,因为划分后的两部分有这样的特点:其他数都出现两次,只有一个数只出现一次。因此,我们又可以运用异或运算,分别得到两部分只出现一次的数。
题目五:
不适用新的变量,交换两个变量的值。
解法:
a=a^b
b=a^b
a=a^b