Каков был бы самый эффективный (также безопасный) способ заменить последнюю цифру длинного? - PullRequest
1 голос
/ 06 марта 2011

Какой самый эффективный (также безопасный) способ заменить последнюю цифру (наименее значимая цифра) long (которая фактически была сгенерирована как метка времени System.currentTimeInMillis ()) какой-либо другой цифрой?

Или есть лучший способ прикрепить любое фиксированное вложение к его концу, используя побитовые операции?

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

В ваших комментариях вы говорите, что двоичные или десятичные цифры будут в порядке. Поскольку Эндрю опубликовал десятичную версию, я публикую двоичную версию, в которой вы хотите заменить 2 ls-бита:

Следующая программа просматривает 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);


}
}
0 голосов
/ 06 марта 2011

Если это не гипотетический вопрос, т. Е. Найти быстрый алгоритм для этого, то, пожалуйста, проигнорируйте этот ответ. Правильный способ (как уже упоминалось) - сделать (somelong / 10) * 10 + newvalue

Более быстрый (гипотетический) способ, вероятно, состоит в том, чтобы иметь некоторый двумерный массив значений корректировки.

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

где первый индекс массива представляет то, что текущее значение имеет 0x0F (последние 4 бита) второй индекс массива будет тем, что вы хотите, чтобы новый номер был

значение является корректировкой переменной

так что код будет

newLong = somelong + настройка [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 и т. Д. И т. Д.

...