黑马程序员技术交流社区
标题:
位运算问题
[打印本页]
作者:
张卫刚
时间:
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