1.移位操作符
移位操作符:可以在二进制的基础上对数字进行平移。(注:移位操作符的操作数只能是整数)
1.1左移操作符:<<
移位规则:左边抛弃,右边补0
接下来我们进行分析:
根据移位规则可知:输出的n的2进制序列为00010100,化成整数为20,而num的值不变。
1.2右移操作符:>>
移位规则:1.逻辑右移:左边用0填充,右边丢弃
2.算术右移:左边用原该值的符号位填充,右边丢弃
同上,如果num的值为-1,就会得到以下两种右移。
无论是移位运算还是位运算,运算编码均为补码,关于原、反、补码可以去看(数据在内存中的存储)一节,文章链接:http://t.csdnimg.cn/1c48z。
2.位操作符
2.1按位与(&)
运算方法:上下比较,有零则零 ,两个都是 1 才是 1。
2.2按位或(|)
运算方法:上下比较有 1 则为 1,两个都是 0 才是 0。
2.3按位异或(^)
运算方法:上下比较,相同为 0 ,相异为 1 。
2.4按位取反(~)
运算方法:上下比较,各对应数字取反,1取0,0取1。
直接上代码:
3.例题分享!!!
例题(1):打印出整数的2进制序列
在思考这道题时,我想到了由于1的补码为00000000 00000000 00000000 00000001,通过循环1<<i再按位与num,就可以使num的每一位都与1进行按位与操作,这样便可以得到num的2进制序列了。
例题(2):不能创建临时变量,实现两个数的交换(一道变态的面试题)
方法一:若按照常规做法,那实现两个数的交换简直是轻而易举。
方法二:但是题目要求不能创建临时变量,所以有人想到了一种巧妙的方法:
在这种方法里巧妙地运用了a+b与a-b,也得出了结果。
下面我们来看方法三。
在看方法三之前,我们需要先知道关于按位异或的一些公式:
(1)a ^ a = 0;
(2)a ^ 0 = a;
方法三:巧妙使用按位异或及规律得出结果。
对于方法三我们简单进行分析,第6行a = a ^ b,第7行b = a ^ b = a ^ b ^ b = a ^ 0 = a,第8行a = a ^ b = a ^ b ^ a = 0 ^ b = b,从而达到交换数字的效果。