В Сдвиге влево C (символ) 0xFF 8 и бросок это к интервалу

Поскольку вы начинаете с String, вам необходимо перейти к объекту DOM (например, Node), прежде чем вы сможете использовать Transformer. Однако, если вы знаете, что ваша XML-строка является допустимой, и вы не хотите нести нагрузку на память при разборе строки в DOM, а затем выполнить преобразование через DOM, чтобы получить строку обратно - вы можете просто сделать несколько старомодным посимвольный разбор. Вставьте новую строку и пробелы после каждых </...> символов, сохраняйте и вставляйте счетчик (для определения количества пробелов), который вы увеличиваете для каждого <...> и уменьшаете для каждого </...>, который вы видите.

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

public static final Element createDOM(String strXML) 
    throws ParserConfigurationException, SAXException, IOException {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource sourceXML = new InputSource(new StringReader(strXML))
    Document xmlDoc = db.parse(sourceXML);
    Element e = xmlDoc.getDocumentElement();
    e.normalize();
    return e;
}

public static final void prettyPrint(Node xml, OutputStream out)
    throws TransformerConfigurationException, TransformerFactoryConfigurationError, TransformerException {
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    tf.transform(new DOMSource(xml), new StreamResult(out));
}
12
задан Geos 8 July 2009 в 09:53
поделиться

4 ответа

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

Для подписанного char 0xFF соответствует -1 (так работает дополнение до двух). Когда вы пытаетесь сдвинуть его, он сначала превращается в int , а затем сдвигается - вы фактически получаете умножение на 256.

Итак, это такой код:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
16
ответ дан 2 December 2019 в 05:28
поделиться

Когда я впервые взглянул на проблему, мое первоначальное мнение заключалось в том, что символ 'c' следует сдвинуть влево на 8 бит - все 8 бит будут отброшены, тогда пустой символ будет преобразован в int со значением 0.

Небольшое исследование показывает Обычные унарные преобразования - именно здесь, чтобы уменьшить большое количество арифметических типов, преобразования применяются автоматически к операндам унарных '!', '- Операторы ',' ~ 'и' * ', и для каждого из операндов двоичных операторов' << 'и' >> '.

Поэтому символ' c 'преобразуется в int сначала , затем сдвинулся влево, дав ответ, который вы видите.

Вы узнаете что-то новое каждый день!

9
ответ дан 2 December 2019 в 05:28
поделиться

char - это не что иное, как символ со знаком. Таким образом, char c = 0xFF будет -1. Если оставить сдвиг -1 на 8 бит, получится -256.

0
ответ дан 2 December 2019 в 05:28
поделиться

c повышается до int перед выполнением операции сдвига. Предполагая, что в вашей реализации символы подписаны по умолчанию, это означает, что вы получите 0xffffffff, который затем сдвинется влево, чтобы получить результат.

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

3
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

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