黑马程序员技术交流社区

标题: 位运算问题 [打印本页]

作者: 张卫刚    时间: 2013-3-9 01:24
标题: 位运算问题
本帖最后由 张卫刚 于 2013-3-9 14:08 编辑

2<<3 用位运算就是2左移3位,也是最快算2*8的方式,我想问的是1:什么情况下会用到位运算符,比如2<<3 来算2*8是高效的,那2*999999和高效运算法呢?难度我还要自已先算下左移多少位啊?
作者: 罗玉宁    时间: 2013-3-9 01:51
本帖最后由 罗玉宁 于 2013-3-9 02:00 编辑

这是Java内部 关于数组排序的一些代码,看红色部分
public static void sort(int[] a) {
sort1(a, 0, a.length);
    }
private static void sort1(int x[], int off, int len) {
  // Insertion sort on smallest arrays
  if (len < 7) {
      for (int i=off; i<len+off; i++)
   for (int j=i; j>off && x[j-1]>x[j]; j--)
       swap(x, j, j-1);
      return;
  }
  // Choose a partition element, v
  int m = off + (len >> 1);       // Small arrays, middle element
  if (len > 7) {
   .......
  }
}
private static void mergeSort(Object[] src,
    Object[] dest,
    int low,
    int high,
    int off) {
.....
int mid = (low + high) >>> 1;
......
}
同样的关于位运算在其他的很多算法中会用到,只不过我们接触的较少。
难道我还要自已先算下左移多少位啊?
不是的,位运算只是一种运算方式,在某些运算中可以提高效率.就像加减乘除一样,只是一种运算的方式我们可以用可以不用。不一定要刻意的用。就像你问题中的提问一样
2*8我们可以用2<<3 来算,这是因为数据简单我们一目了然,对于2*999999我们不知道移动多少位,我们为什么还要移位直接用乘法算就行了呗。
作者: 罗玉宁    时间: 2013-3-9 02:07
毕向东老师关于进制转换的算法中也用到位运算,Java中的进制转换也是用位运算的方式实现的如下部分代码
public static String toBinaryString(int i) {
        return toUnsignedString(i, 1);
    }

    /**
     * Convert the integer to an unsigned number.
     */
    private static String toUnsignedString(int i, int shift) {
        char[] buf = new char[32];
        int charPos = 32;
        int radix = 1 << shift;        int mask = radix - 1;
        do {
            buf[--charPos] = digits[i & mask];
            i >>>= shift;
        } while (i != 0);
java中还有很多地方用到位运算,有时间你可以自己找找看。

作者: 张卫刚    时间: 2013-3-9 10:54
同学们,细心回答我下啊,例如多来两个简单的例子或什么情况下用
作者: 陈丽莉    时间: 2013-3-9 12:35
我觉得一二楼的回答已经很好了~  
什么情况下会用到位运算符?总结起来基本就是:简单明了可以提高效率的,就用位运算符,比如两数相乘,明显有至少一个是2的多少次幂。(其实不用也差不了多少,那道题主要是考察知识点的)
还有其他问题么? 欢迎追问,没有的话请将帖子分类改成【已解决】。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2