替换长的最后一位数的最高性能(也是安全)方法是什么?

时间:2011-03-06 05:51:06

标签: java bit-manipulation long-integer

long(实际上由System.currentTimeInMillis()生成的时间戳)的最后一位(最低有效数字)替换其他数字的最高性能(也是安全)方法是什么?

或者是否有更好的方法通过使用按位运算将任何固定附件附加到其末尾?

2 个答案:

答案 0 :(得分:2)

在你的评论中,你说二进制数字或十进制数字都没问题。由于Andrew发布了十进制版本,我发布了你想要替换2 ls-bits的二进制版本:

以下程序介绍了4种可能性,您可以使用它们替换2 ls位并生成输出:

9999999999999999
9999999999999996
9999999999999997
9999999999999998
9999999999999999

代码:

public class A {
public static void main(String[] args) {

    long aLong = 9999999999999999L;
    System.out.println(aLong);

    long aLong2 = aLong & ~3 + 0;
    System.out.println(aLong2);
    aLong2 = aLong & ~3 + 1;
    System.out.println(aLong2);
    aLong2 = aLong & ~3 + 2;
    System.out.println(aLong2);
    aLong2 = aLong & ~3 + 3;
    System.out.println(aLong2);


}
}

答案 1 :(得分:0)

如果这不是一个假设的问题,即找到一个快速的算法,那么请忽略这个答案。正确的方法(如上所述)是(somelong / 10)* 10 + newvalue

更快(假设)的方式可能是有一些二维数组的调整值。

int [] [] adjustment = new int [16] [10];

其中第一个数组索引表示当前值以0x0F(最后4位)为单位 第二个数组索引将是你想要的新数字

该值是对变量的调整

所以代码是

newLong = somelong + adjustment [somelong& 0x0F] [what_you_want_the_new_digit];

所以没有乘法或除法

作为一个例子,假设输入数字是22,你希望它是26

26是011010所以26& 0x0F是最低4位1010,即10

调整[10] [6] = 4(您已经预先确定它是4)

所以你有22 + 4 = 26

显然索引10与索引0相同,索引11与索引1等相同,等等。