关于位运算和进制问题
2017-10-20 00:00
197 查看
位运算是直接对二进制进行运算,所以计算效率是最高的;
几个规律特点总结:
1、左移位运算:相当于乘以2的移动位数次幂;6<<2=6*(2*2) = 24;
2、右移位运算:相当于除以2的移动位数次幂后取整;6>>2=6/(2*2)=1;
3、右移位运算:如果最高位是0,右移后,用0补空位;如果最高位是1,右移后,用1补空位;
4、无符号右移:无论最高位是什么,右移后,都用0补;
5、与、或、异或运算:把0当假,1当真,如此转换运算; 异或:同真同假为真,一真一假为假;
6、负数的二进制:将正数取反后加1;取反就是二进制结果0变1,1变0;取反就是上面的反码运算;
7、如何判断负数二进制是哪一个负数,减一再取反即可;直观很难看出来和算出来;
8、异或一个数两次得到值不变,可以用来加密算法;
9、“与”一个每位都是1的二进制,得到的值也是原来的值;可以用来求一个二进制的八进制,十六进制的表示形式;1&1=1;0&1=0;
10、“或”一个每位都是0的二进制,得到的值也是原来的值;这条与上一条,关键看高位置的数需要如何处理;1|0=1;0|0=0;
举个栗子:
1、如何实现两个变量值互换,不借助第三个变量;
int m,n;
方法1:n = n + m;m = n - m;n = n - m;
可用 11 = 3 + 8;3 = 11 - 8;8 = 11 -3 理解;
但是这种方式,可能会存在精度损失,因为int有最大值限制,如果两个数想加大于最大值,就有问题了;
方法2:n = n^m;m = n^m;n = n^m;原理就是利用的异或同一个数两次值不变;
记忆,左边分别是n\m\n;右边都是n^m;
2、如果获取一个二进制的八进制和十六进制的表示形式;
思路:把每个二进制分别与 八进制和十六进制最大的三位数,然后再右移三位和四位即可;
然后把每次得到的数分别做一个两个进制的表示形式的映射函数即可;
如:00001010 & 00000 111 就可以得到最后一位八进制的数;
因为0和1与1都得其本身;
这里移位运算,最好用无符号移位,因为不论正负,最高位都是用0在补的;(对于负数,可能这么搞不对;遇到了再说)
3、进制的转换的补充:
把一个十进制转换为二进制,八进制,十六进制的方法就是分别除以2,8,16,取得的余数即可直到没法除以为止;相反变为十进制,就是用该进制表示形式乘以该进制 的0到n次幂的和;如8^0*a+8^1*b+8^2*c+.......j即可得到十进制数;
在二进制种,一位一组就表示二进制;三位一组;就表示八进制;四位一组,就表示十六进制;
即 0000 000 000 111 101 这样来三位一组划分的二进制,就可以转换为八进制,十六进制也是如此道理;这样可以实现二进制与八进制和十六进制的转换;
八进制和十六进制的相互转换,可以先转为二进制或十进制再转换;
4、关于运算符的补充:
既然是运算符,肯定就是代表着肯定是有运算结果的;不管是几个元素参与运算;下面分别是一个元素,两个元素,三个元素参与运算的总结;
一元运算:非,not;
二元运算:加减乘除以及位运算等;
三元元素:if?a:b;
相关文章推荐
- 关于进制运算的问题
- 2014年3月2日 关于Matlab 运算过程中的一些错误问题
- 关于exec中不能有变量运算的问题
- 关于表达式 运算溢出等问题
- C#中,关于除法“/”运算得一点问题。
- 关于字符串的运算问题
- 关于Java浮点数运算精度丢失问题
- 关于x=x++运算式运算结果为0的问题
- 关于PHP运算精确度的问题
- 关于java中Double类型的运算精度问题
- 关于java中Double类型的运算精度问题
- 关于用数组替代递归算法,提高运算速度的问题
- 关于矩阵运算的若干问题
- 关于C语言运算的自动提权及类型转换的问题
- 关于浮点型加减乘除运算不精确的问题
- 关于js语法(运算中出现无限大的问题)本身的错误的解决方案
- 关于Java中用Double型运算时精度丢失的问题,真的很蛋疼!
- 关于java中Double类型的运算精度问题
- 关于浮点数的运算误差问题
- 关于商业运算中浮点型运算丢失精度问题