我有一个已排序的JavaScript数组,并希望在数组中再插入一个项目,以便生成的数组保持排序状态.我当然可以实现一个简单的快速插入式插入功能:
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.splice(locationOf(element, array) + 1, 0, element);
return array;
}
function locationOf(element, array, start, end) {
start = start || 0;
end = end || array.length;
var pivot = parseInt(start + (end - start) / 2, 10);
if (end-start <= 1 || array[pivot] === element) return pivot;
if (array[pivot] < element) {
return locationOf(element, array, pivot, end);
} else {
return locationOf(element, array, start, pivot);
}
}
console.log(insert(element, …Run Code Online (Sandbox Code Playgroud) 如果您恰好使用2的幂,则左右移位显然比大多数甚至所有CPU上的乘法和除法运算更快.但是,它可能会降低某些读取器和某些算法的代码清晰度.位移对于性能是否真的是必要的,或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET行为感兴趣,但欢迎深入了解其他语言实现.
我发现此代码在SO帖子中找到重复项.但我不明白这条线的含义int mid = (low + high) >>> 1;
private static int findDuplicate(int[] array) {
int low = 0;
int high = array.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
System.out.println(mid);
int midVal = array[mid];
if (midVal == mid)
low = mid + 1;
else
high = mid - 1;
}
return high;
}
Run Code Online (Sandbox Code Playgroud) 我想知道这可能是一个JVM错误吗?
java版"1.6.0_0"OpenJDK运行时环境(IcedTea6 1.4.1)(6b14-1.4.1-0ubuntu13)OpenJDK 64位服务器VM(内置14.0-b08,混合模式)
class Tmp {
public static void main(String[] args) {
System.out.println("1>>1 = "+(1>>1));
System.out.println("1>>2 = "+(1>>2));
System.out.println("1>>31 = "+(1>>31));
System.out.println("1>>32 = "+(1>>32));
System.out.println("1>>33 = "+(1>>33));
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时产生这个:
1>>1 = 0
1>>2 = 0
1>>31 = 0
1>>32 = 1 <---------- should be 0 i think
1>>33 = 0
Run Code Online (Sandbox Code Playgroud)
对于任何32的倍数,我也得到相同的结果.
我需要写自己的右移检查这个吗?
JavaScript代码:
alert( -123456 >>> 0 ); // Prints 4294843840
Run Code Online (Sandbox Code Playgroud)
Java代码:
System.out.println( -123456 >>> 0 ); // Prints -123456
Run Code Online (Sandbox Code Playgroud)
为什么?我已阅读文档,但我没有发现差异.如何将JavaScript代码移植到Java?
我理解Java中的无符号右移运算符">>>",但为什么我们需要它,为什么我们不需要相应的无符号左移运算符?
如何在C/C++中执行无符号右移(在Java中>> >>)?
关于负数的右移操作我很困惑,这里是代码.
int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));
Run Code Online (Sandbox Code Playgroud)
结果是:
11111111111111111111111111110001
11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
为什么要将负数移31而不是1(符号位)?
java bit-manipulation bit-shift bitwise-operators negative-number
我没有Java参考书,我很难找到谷歌的答案.
Java中的">>"和">>>"运算符有什么区别?
int value = 0x0100;
int result = (value >> 8);
System.out.println("(value >> 8) = " + result); // Prints: "(value >> 8) = 1"
result = (value >>> 8);
System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1"
Run Code Online (Sandbox Code Playgroud)