Нахождение самого высокого порядка 1 в примитивном Java

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

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

, потому что система разработана для отправки изображений, его полученный набор по-другому закодированных частей. часть mms.smil.txt, текст/плоскость (то, которое бесполезно, просто говорит 'это, является сообщением HTML'), application/smil часть (который часть, которая телефоны были бы рис. на), текст/HTML расстаются с рекламой для моего поставщика услуг, тогда моим сообщением, но все перенеслись в HTML, тогда наконец вложение текстового файла с моим сообщением открытым текстом (который является использованием первой части) (если я пихаю изображение как вложение в сообщении, его помещенном во вложение 1, base64 закодированный, тогда моя текстовая часть присоединяется как вложение 2)

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

у меня есть другие проекты, к которым я хотел бы расширить этот телефон-> почта-> синтаксический анализ-> система команд, но у меня должен быть стабильный/твердый/универсальный синтаксический анализатор для вытаскивания различных частей из почты для использования его.

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

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

я думаю, что оказываюсь перед необходимостью стиснуть зубы и просто тщательно записать что-то мой сам.

7
задан twolfe18 29 November 2009 в 15:04
поделиться

6 ответов

Integer.numberOfLeadingZeros (i) + 1

В этом методе используется прекрасный подход «разделяй и властвуй», скопированный здесь для вашего обзора:

public static int numberOfLeadingZeros(int i) {
    // HD, Figure 5-6
    if (i == 0)
        return 32;
    int n = 1;
    if (i >>> 16 == 0) { n += 16; i <<= 16; }
    if (i >>> 24 == 0) { n +=  8; i <<=  8; }
    if (i >>> 28 == 0) { n +=  4; i <<=  4; }
    if (i >>> 30 == 0) { n +=  2; i <<=  2; }
    n -= i >>> 31;
    return n;
}
14
ответ дан 6 December 2019 в 10:51
поделиться

Страница " Bit Twiddling Hacks " содержит множество битовых хаков. Один из них - как найти индекс бита высшего порядка .

3
ответ дан 6 December 2019 в 10:51
поделиться

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

Кроме того, символ не 8 бит ... Думаю, вы имели в виду байт.

0
ответ дан 6 December 2019 в 10:51
поделиться

Понятия не имею, быстрее ли это. Но у него нет цикла.

if(i==0) return -1;

highest=0;
if (i & 0xffff0000)
{
   highest+=16;
   i>>=16;
}
if (i & 0xff00)
{
   highest+=8;
   i>>=8;
}
if (i & 0xf0)
{
   highest+=4;
   i>>=4;
}
if (i & 0xC)
{
   highest+=2;
   i>>=2;
}
if (i & 0x2)
{
   highest+=1;
}

return highest;
1
ответ дан 6 December 2019 в 10:51
поделиться

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

Ключ к быстрому получению ответа - использовать двоичный поиск. Вы смотрите на длинный с 64 битами? 6 сравнений каждый раз дадут вам наивысший бит.

Код работает с большим уродливым деревом из 64 операторов if, но только часть из них будет когда-либо выполнена, так что время выполнения хорошее.

Если вы нужен образец кода, я могу это сделать. Но я бы не стал.

0
ответ дан 6 December 2019 в 10:51
поделиться

Java компилируется в независимый от платформы байт-код, поэтому вы не можете ожидать поддержки инструкций ЦП. В противном случае ваш код или Integer.highestOneBit () должен быть максимально быстрым.

0
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

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