Риск создания его, который комплекс - то, что никто больше не поймет его. В этом случае прокомментируйте его ясно и процитируйте некоторые источники, которые помогут кому-то еще учиться и понять его.
риск создания простой случается так, что кто-то не захочет понимать его, потому что это длинно.
Для записи синтаксический анализатор 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
положительны, вместо того, чтобы утверждать, что их сумма положительна, в этом случае больше смысла.
] Еще один, который вы выполняете в диапазоне битов:
~(0xff << (offset + 1))
-->
~(0xfe << offset)
Поскольку << 1
не более чем * 2
, вы можете выполнить эту операцию над своей константой (которая, если вы работаете в байтах Signle просто избавляется от LSB).
Вы можете ускорить первую функцию, сначала сдвинувшись вправо, а затем замаскировав бит:
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);
Если вы хотите получить действительно быстро, вы можете использовать таблицу поиска. Я предполагаю, что это то, к чему стремился интервьюер (в качестве окончательного ответа на вопрос «как я могу сделать это быстрее»).
По сути, это означает, что вы заранее создаете огромную таблицу, сопоставляя все возможные комбинации параметров с правильный результат. Например, у вас будет:
byte = 0x0, pos = 0, result = 0
byte = 0x0, pos = 1, result = 0
...
byte = 0x1, pos = 0, result = 1
Очевидно, это нужно будет поместить в допустимые структуры данных c (массивы, проиндексированные по байтам и позициям). Это позволит вам в вашей функции просто вернуть место в массиве на основе любой выбранной вами схемы индексации.
Для первой функции это не займет слишком много памяти. Мы говорим о байтах значений (байт может иметь 256 различных значений) умноженных на 8 возможных значений для начала pos, что составляет массив из 2048.
Для второй функции это фактически заняло бы намного больше места. Вам нужно будет умножить в 256 раз все возможные значения как для начальной, так и конечной позиции (учитывая, что существуют недопустимые комбинации начальной и конечной позиции).
Я предполагаю, что интервьюер просто хотел, чтобы вы ответили, что это был бы способ ускорить его, а затем использовать вышеизложенное мышление, чтобы попытаться оценить, сколько места это будет стоить по сравнению с сэкономленным временем.