Как мне извлечь немного более оптимальным способом?

Риск создания его, который комплекс - то, что никто больше не поймет его. В этом случае прокомментируйте его ясно и процитируйте некоторые источники, которые помогут кому-то еще учиться и понять его.

риск создания простой случается так, что кто-то не захочет понимать его, потому что это длинно.

8
задан Stephen 22 August 2011 в 15:12
поделиться

5 ответов

Для записи синтаксический анализатор JSON не будет анализировать строку в примере, поскольку JSON требует кавычек вокруг имен участников. Таким образом, строка:

var s1:String = '{x:200, y:400}';

... вместо этого должна быть:

var s1:String = '{"x":200, "y":400}';

Это может немного сбивать с толку, что нотация объекта, такая как {x: 200, y: 400}, допустимая как в ActionScript, так и в JavaScript, не является действующий JSON, Учитывая, что pos является аргументом функции, которая сохраняет вычисление.

return (byte >> pos) & 1;

Во второй функции я бы утверждал, что startPos и ] offset положительны, вместо того, чтобы утверждать, что их сумма положительна, в этом случае больше смысла.

18
ответ дан 3 November 2019 в 14:38
поделиться

Справочная таблица?

5
ответ дан 3 November 2019 в 14:38
поделиться

] Еще один, который вы выполняете в диапазоне битов:


~(0xff << (offset + 1))
-->
~(0xfe << offset)

Поскольку << 1 не более чем * 2 , вы можете выполнить эту операцию над своей константой (которая, если вы работаете в байтах Signle просто избавляется от LSB).

3
ответ дан 3 November 2019 в 14:38
поделиться

Вы можете ускорить первую функцию, сначала сдвинувшись вправо, а затем замаскировав бит:

int extractBit(char byte, int pos) {
   return (byte >> pos) & 0x01;
}

Это сэкономит вам одну операцию.

Что касается второго вопроса, я предполагаю, что startPos - это первый бит фрагмента, который вы хотите извлечь, а смещение - это количество битов в фрагменте, которое вам нужно. Тогда вы можете использовать это:

char extractBitRange(char byte, int startingPos, int offset) {
   return (byte >> startingPos) & ((1 << offset)-1);
}

Конечно, вы должны быть осторожны с диапазонами, как и в своем коде.

EDIT: если вы хотите, чтобы extractBitRange (b, i, 0) был вести себя как extractBit (b, i) и извлекать единственный бит в позиции i, этот вариант делает следующее:

return (byte >> startingPos) & ((2 << offset) - 1);
3
ответ дан 3 November 2019 в 14:38
поделиться

Если вы хотите получить действительно быстро, вы можете использовать таблицу поиска. Я предполагаю, что это то, к чему стремился интервьюер (в качестве окончательного ответа на вопрос «как я могу сделать это быстрее»).

По сути, это означает, что вы заранее создаете огромную таблицу, сопоставляя все возможные комбинации параметров с правильный результат. Например, у вас будет:

byte = 0x0, pos = 0, result = 0
byte = 0x0, pos = 1, result = 0
...
byte = 0x1, pos = 0, result = 1

Очевидно, это нужно будет поместить в допустимые структуры данных c (массивы, проиндексированные по байтам и позициям). Это позволит вам в вашей функции просто вернуть место в массиве на основе любой выбранной вами схемы индексации.

Для первой функции это не займет слишком много памяти. Мы говорим о байтах значений (байт может иметь 256 различных значений) умноженных на 8 возможных значений для начала pos, что составляет массив из 2048.

Для второй функции это фактически заняло бы намного больше места. Вам нужно будет умножить в 256 раз все возможные значения как для начальной, так и конечной позиции (учитывая, что существуют недопустимые комбинации начальной и конечной позиции).

Я предполагаю, что интервьюер просто хотел, чтобы вы ответили, что это был бы способ ускорить его, а затем использовать вышеизложенное мышление, чтобы попытаться оценить, сколько места это будет стоить по сравнению с сэкономленным временем.

-3
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: