Ответ зависит от того, что должны представлять младшие 31 бит вашего ввода.
int input = 0x6FD40640 & 0x7FFFFFFF; //strip top bit; only here for clarity
Беззнаковый ввод: 0x6FD40640 == 1876166208
Дополнение до двух (желаемый результат: -271317440)
Целое число в дополнении до двух — это целое число, в котором -1 имеет все установленные биты, а меньшие отрицательные числа отсчитываются оттуда. Первый бит по-прежнему действует как бит знака.
1000 -> -8
1001 -> -7
...
1110 -> -2
1111 -> -1
0000 -> 0
0001 -> 1
Если младшие 31 бит представляют целое число с дополнением до двух, то я думаю, что вы должны просто сделать это:
input = (input << 1) >> 1;
Это связано с тем, что Java хранит целые числа в дополнении до двух внутри: все, что мы делаем, это сдвигаем влево, а затем сдвигаем назад вправо (со знаком), так что бит знака берется, и целое число переходит от 31 бита к 32 битам.
Дополнение до единицы (желаемый результат: -802424384)
Представление числа в дополнении до единицы — это представление, в котором первый бит является выделенным битом знака, а остальные биты представляют величину. Младшие биты -100 будут такими же, как младшие биты 100:
1111 -> -7
1110 -> -6
...
1001 -> -1
1000 -> -0 (anomoly)
0000 -> 0
0001 -> 1
Если младшие 31 бит представляют дополнение до единицы целое число (то есть знаковый бит, за которым следуют 30 бит, представляющие беззнаковую величину), то вам необходимо преобразовать его в дополнение до двух, чтобы Java правильно извлек значение. . Для этого вам просто нужно извлечь младшие 30 бит и умножить на -1:
if ( input & 0x40000000 ) {
input = (input & 0x3FFFFFFF) * -1;
}
В комментариях к вопросу вы сказали, что после преобразования в градусы (деления на 3600000) вы получаете около -75,36. Когда я делю -271317440 на 3600000, я получаю -75,36595555555556, поэтому я предполагаю, что ваш формат ввода - дополнение до двух, поэтому мой первый и первоначальный ответ был правильным.
person
Mark Peters
schedule
14.10.2010