位运算之加减乘除 练习题【★★★★】【★★★★】【★★★★】【★★★★】【★★★★】
知识点 or and not xor
1、如何通过位运算判断一个数是奇数还是偶数?
一个数如果是奇数的话,那么他的二进制最后一位一定为1.
比如 3, 他的二进制表示为 11
而 1 的二进制为 01
,两个相与,则为1. 而偶数的话则就为0了
2、如何读取二进制数中的某一位的值?【★★★★】
②通过右移操作符(>>)、按位与操作符(&)实现
Example:当num=10(1010),通过右移操作num>>i,二进制向右移动i位。
//i=0,num>>0,右移0位,此时(1010)&(0001)=0
//i=1,num>>1,右移1位,此时(0101)&(0001)=1,count++
//i=2,num>>2,右移2位,此时(0010)&(0001)=0
//i=3,num>>3,右移3位,此时(0001)&(0001)=1,count++
……
因为二进制共32位,所以循环要执行32次后结束,得到count为2。
缺点:不够高效,必须循环32次。
③通过按位与操作符(&)巧妙运算实现
Example: 当num=15时,
1//num&(num-1)=(1111)&(1110)=(1110)
2//num&(num-1)=(1110)&(1101)=(1100)
3//num&(num-1)=(1100)&(1011)=(1000)
4//num&(num-1)=(1000)&(0111)=0 ,循环停止。共执行4次while循环。
3、如何设置二进制数中的某一位的值?【★★★★】
用与运算
4、2*8的最高效的实现方式
0000 0010 <<3位 0001 0000
位运算,使用左移运算是最高效的,把一个数向左移动n位相当于把该数乘以2的n次方,因此当乘法运算中的某个数字满足这个特点时,就可以用移位操作来代替乘法操作,从而提高效率,8向左移一位就是16
00001000<<1位00010000
5、使用异或对 87AD6 进行加密后再进行解密,加解密密钥:5
1000 0111 1010 1101 0110
0000 0000 0000 0000 0101
1000 0111 1010 1101 0011 加密结果
解密:
1000 0111 1010 1101 0011
0000 0000 0000 0000 0101
1000 0111 1010 1101 0110 解密结果
6、八进制数2-5 在计算器中的的结果是:1777777777777777777775 为什么?
2+(-5)
在计算
77、只用逻辑运算计算2-3=?(涉及内容:逻辑运算、移位、数据宽度)
以八位二进制为例,下面是计算过程
异或
0000 0010
1111 1101
1111 1111 结果
与
0000 0010
1111 1101
0000 0000 无进位
1111 1111 无符号数是FF,有符号数是负1(-1)