A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张卫刚 中级黑马   /  2013-3-9 01:24  /  1213 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张卫刚 于 2013-3-9 14:08 编辑

2<<3 用位运算就是2左移3位,也是最快算2*8的方式,我想问的是1:什么情况下会用到位运算符,比如2<<3 来算2*8是高效的,那2*999999和高效运算法呢?难度我还要自已先算下左移多少位啊?

4 个回复

倒序浏览
本帖最后由 罗玉宁 于 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我们不知道移动多少位,我们为什么还要移位直接用乘法算就行了呗。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
毕向东老师关于进制转换的算法中也用到位运算,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中还有很多地方用到位运算,有时间你可以自己找找看。
回复 使用道具 举报
同学们,细心回答我下啊,例如多来两个简单的例子或什么情况下用
回复 使用道具 举报
我觉得一二楼的回答已经很好了~  
什么情况下会用到位运算符?总结起来基本就是:简单明了可以提高效率的,就用位运算符,比如两数相乘,明显有至少一个是2的多少次幂。(其实不用也差不了多少,那道题主要是考察知识点的)
还有其他问题么? 欢迎追问,没有的话请将帖子分类改成【已解决】。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马