Category: технологии

Category was added automatically. Read all entries about "технологии".

?!!!

Java:

System.out.println( 1L << 64 );

пошёл читать спеки

upd Я чо хочу сказать. Конкретное место, где написано про округление найти легко. А вот какого лысого спек написан именно так? Гораздо более очевидным было бы поведение типа 1L << 64 == 0, т.к. не только я, но и мои коллеги, не раздумывая, дают именно такой ответ - не каждый же день с битами играешься.

ОК, я могу понять, что JVM спек написан, опираясь на "целевые архитектуры" (чтобы на них меньше работы было). Но это лишь делегирует вопрос от дизайнеров JVM к дизайнерам "целевых архитектур". В Intel Architecture описание SHL именно такое - т.е. округление операнда. Так вот, мой настоящий вопрос: ...какой ход мыслей оправдывает такое поведение SHL?

Я как-то верчу-верчу подходы к реализации битовых операций - чо-то не соображу, где бы это было полезно.

чё-то типа такого?:

// опустим вопрос эффективности для t==0, t==64, оставим вопрос консистентности

void shl( long [] x, int t ) {
  int off=t >> 6; 

  if( off < x.length ) {
    t &= 63; // это и вся экономия? но мне всё равно нужно округлять, чтобы SHR правильно работал
    long carry = x[x.length-1 - off] << t; // t==64 => если не округлять t до 0, то да, wtf
    for( int i = x.length-off-2; i >= 0; --i ){ // little-endian
      long v = x[i];
      x[i+off+1] = carry | (v >>> ( 64 - t )); // t==0 => округляй - не округляй t, а wtf
      carry = v << t; // t==64 => если не округлять t до 0, то да, wtf
    }
    x[off] = carry;
  }
  else off = x.length;
  for( int i=0; i < off; ++i ) x[i] = 0;
}



Остаётся вариант "Шарим электронику от ROL?"