位运算之加减乘除 练习题【★★★★】【★★★★】【★★★★】【★★★★】【★★★★】

知识点 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)

原文地址:https://www.cnblogs.com/pufan/p/12081393.html