2014-01-28 7 views
0

Я - код javascript, обезьяна, поэтому для меня это девственная территория.Работа со строкой (array?) Бит неопределенной длины

У меня есть две «струны», которые только нули и единицы:

var first = "00110101011101010010101110100101010101010101010"; 
var second = "11001010100010101101010001011010101010101010101"; 

Я хочу, чтобы выполнить побитовое & (который я никогда раньше не работал с), чтобы определить, есть ли какой-либо индекс, где 1 появляется в обеих строках.

Возможно, они могут быть ОЧЕНЬ длинными строками (в тысячах символов). Я подумал о том, чтобы объединить их в числа, а затем преобразовать в строки и проверить на 2, но javascript не может удерживать точность в больших интервалах, и я возвращаю числа в виде строк, таких как "1.1111111118215729e+95", что на самом деле не очень помогает мне.

Могу ли я взять две строки неопределенной длины (они могут быть не одинаковой длины) и как-то использовать поразрядный &, чтобы сравнить их?

Я уже построил решение для сквозных символов, но 1001^0110 ударил бы меня как крупное обновление производительности. Пожалуйста, не давайте javascript looping solution в качестве ответа, этот вопрос касается использования побитовых операторов.

+0

Если вы зададите вопрос, я бы не сказал ответчикам, что вы собираетесь их понижать, если они дают определенный ответ, особенно если ответ может быть лучшим ответом – scrblnrd3

+0

@ scrblnrd3, за исключением того, что я получаю много людей, предлагающих полностью несвязанные ответы, когда я выхожу на конечность с необычными приложениями функциональности, а именно «нормальным» обходным решением. Понял, что это было справедливое предупреждение. –

+0

Тем не менее, есть проблема с использованием цикла, кроме того, что вы задали вопрос о поразрядке? – scrblnrd3

ответ

1

Как вы уже заметили, javascript имеет ограниченные возможности, если речь идет о целых значениях. Вы должны будете нарезать свои струны в «съедобные» порции и проложить себе путь через них. Так как функция ParseInt() принимает базу, можно преобразовать 64 символов в 8 байт Int (или 32 до 4 байта Int) и использовать и-оператор для проверки установленных битов (if (a & b != 0))

+0

Я бы рекомендовал бенчмаркинг этого, чтобы узнать, действительно ли это быстрее, чем повторение символов. У меня есть сомнения. – JLRishe

+0

Так же, как и я. Исходный вопрос исключает метод петлирования. Было бы просто: взять одну строку и перебрать ее. Как только вы нажмете «1», проверьте другую строку. Подход выше будет только быстрее, если интерпретатор будет очень медленным, а встроенные функции преобразования будут быстрыми. – Ronald

+0

@JLRishe Я буду проводить бенчмаркинг, когда у меня будет полная функциональность, построенная для моего сценария. Функции преобразования определенно будут подстановочными знаками здесь - фактическое сопоставление должно быть значительно быстрее. –

-1
var first = "00110101011101010010101110100101010101010101010010001001010001010100011111", 
    second = "10110101011101010010101110100101010101010101010010001001010001010100011100", 
    firstInt = parseInt(first, 2), 
    secondInt = parseInt(second, 2), 
    xorResult = firstInt^secondInt, //524288 
    xorString = xorResult.toString(2); //"10000000000000000000" 
+0

Это не сработает, если строки являются длинными тысячами символов, о чем заявляет афер как требование. – JLRishe

Смежные вопросы