Битовые операторы приведут к 32-битному номеру со знаком , означающему, что если бит в позиции 31 (считая от младшего значащего бита справа, который является битом 0) равен 1, число будет отрицательным.
Чтобы этого не происходило, используйте операторы, отличные от <<
или |
, которые приводят к получению 32-разрядного числа со знаком. Например:
(bit * 2**e) + make (more, e + 4)
Операторы сдвига битов предназначены для принудительного перевода результата в 32-битный диапазон со знаком, по крайней мере, это заявлено в MDN (на момент написания):
Операнды всех побитовых операторов преобразуются в 32-разрядные целые числа со знаком
blockquote>На самом деле это не совсем так. Оператор
>>>
является исключением из этого. EcmaScript 2015, раздел 12.5.8.1. утверждает, что операнды отображаются в беззнаковых 32-битных перед сдвигом в 0 битов. Таким образом, даже если бы вы сместили ноль битов, вы бы увидели этот эффект.Вам нужно будет применить его только один раз к конечному значению, как, например, в вашей функции
console.log((n>>>0).toString(2))
Решение BigInt
Если вам нужно даже больше 32 биты, и ваш движок JavaScript поддерживает BigInt , как , который некоторые уже делают, затем используйте BigInts для операндов, участвующих в побитовых операторах - тогда они не будут использовать Перенос 32-разрядных чисел со знаком (обратите внимание на суффиксы
n
):
const make = ([ bit, ...more ], e = 0n) => bit === undefined ? 0n : (bit << e) + make (more, e + 4n) const print = n => console.log(n.toString(2)) // Test for (let i=1; i<20; i++) { print(make(Array(i).fill(15n))) // longer and longer array... }
Примечание: если вы получаете сообщение об ошибке выше, попробуйте еще раз с Chrome ...
Вы правы со стандартным XML API, нет хорошего пути - вот один пример (может быть ошибка, на которой поехали; это работает, но я записал это давным-давно).
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import java.io.*;
public class Proc
{
public static void main(String[] args) throws Exception
{
//Parse the input document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("in.xml"));
//Set up the transformer to write the output string
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
//Find the first child node - this could be done with xpath as well
NodeList nl = doc.getDocumentElement().getChildNodes();
DOMSource source = null;
for(int x = 0;x < nl.getLength();x++)
{
Node e = nl.item(x);
if(e instanceof Element)
{
source = new DOMSource(e);
break;
}
}
//Do the transformation and output
transformer.transform(source, result);
System.out.println(sw.toString());
}
}
Казалось бы, что Вы могли получить первого ребенка только при помощи doc.getDocumentElement () .getFirstChild (), но проблема с этим состоит в том, если существует какой-либо пробел между корнем и дочерним элементом, который создаст текстовый узел в дереве, и Вы получите тот узел вместо фактического узла элемента. Вывод из этой программы:
D:\home\tmp\xml>java Proc
<?xml version="1.0" encoding="UTF-8"?>
<element1>
<child attr1="blah">
<child2>blahblah</child2>
</child>
</element1>
Я думаю, что можно подавить xml строку версии, если Вам не нужна она, но я не уверен в этом. Я, вероятно, попытался бы пользоваться сторонней библиотекой XML если вообще возможный.
XMLBeans является простым в использовании (после того как Вы приобретаете навык его), инструмент для контакта с XML, не имея необходимость иметь дело с раздражениями из-за парсинга.
Это требует, чтобы у Вас была схема для XML-файла, но это также обеспечивает инструмент для генерации схемы от exisint XML-файла (в зависимости от потребностей, сгенерированный на прекрасен, вероятно).
Я рекомендовал бы JDOM. Это - библиотека Java XML, которая делает контакт с XML намного легче, чем стандартный подход W3C.
Если Ваш xml имеет схему, поддерживающую его, Вы могли бы использовать xmlbeans, или JAXB для генерации pojo возражает, что помогают Вам упорядочить/не упорядочить xml.