2012-04-24 2 views
0

У меня есть 10-битная двоичная строка, и мне приходится побитовое смещение по кругу на каждой итерации. Я так запутался и потерял это. Что может быть логикой для этого, чтобы сделать это легко? Если это шестнадцатеричное число, мы можем сделать это с помощью num >> 1 или num < < 1, но строка типа «1010101010» должна быть преобразована в шестнадцатеричную, прежде чем применять побитовый сдвиг. Я должен применять побитовый сдвиг круговой 10 раз.Как побитовое смещение двоичной строки в java?

+4

Применение кругового сдвига к двоичной строке длиной -10 10 раз является нулевой операцией ... –

+0

Является ли это домашней проблемой? (если это так, это прекрасно, вы должны просто пометить его как один) – JRaymond

+0

совсем не ... Я работаю над некоторыми манипуляциями и сам с энтузиазмом пишу логику .. – volatNumbers

ответ

1

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

Если вы просто хотите выполнять текстовые операции, вы можете использовать StringBuffer и играть с символами.

StringBuffer s = new StringBuffer("1010101010"); 
for(int i=0; i<10; i++) { 
    char c = s.charAt(0); 
    s.append(c); 
    s.deleteCharAt(0); 
} 
String result = s.toString(); 

Но это просто некрасиво, если вы просто пытаетесь сделать математику

2

Есть методы в классе Integer для преобразования в/из двоичных строк.

int i = Integer.parseInt("1010101010", 2); 
    String shiftedi = Integer.toBinaryString(i<<1); 

Edit, выше не является круговой, хотя, но вы можете использовать простые операции Строки:

String in = "1010101010"; 
String shifted1 = in.substring(1)+in.substring(0,1); 
0
int bits = Integer.parseInt ("010101010", 2); 

преобразует строку в междунар. «Преобразование в шестнадцатеричный, прежде чем мы применяем побитовый сдвиг» - это нонсенс - извините. Hex - это просто способ представления int (например). Вы меняете значение int, а не его представление.

1

Предполагая, что вы имеете дело с String, который содержит нули и единицы (он же «двоичная строка»), побитовое смещение легко.

Чтобы «сдвинуть влево», добавьте символ «0» в правый конец для каждого «сдвига влево».

Чтобы «сдвинуть вправо», все немного сложнее. Предполагая, что вы всегда имеете дело с «положительным числом» в двоичном формате, удалите символ в правом конце для каждого «правого сдвига». Если вы хотите сделать «знак расширенного сдвига вправо», вам нужно проверить длину строки, чтобы увидеть, является ли она «максимальной длиной» для конкретной кодировки двоичного значения в форме дополнения 2, тогда вам нужно удалить самый правый символ и необязательно добавить символ «1» влево, при условии, что самый левый символ уже «1».

Теперь, поскольку строки не ограничены в длине (в то время как СЛОВА и DWORDs являются) не ясно, делает ли >>> оператора смысла для двоичной строки, или даже если 2 дополнения представления отрицательных чисел имеет смысл для двоичной строки, если вы не наложите «ограничение» на число допустимых символов в строке. Это ограничение должно быть одинаковым для двух двоичных строк (или иметь правила продвижения для меньшей строки), если вы хотите сделать любую двоичную математику между двумя двоичными строками.

Другой вариант состоит в том, чтобы просто преобразовать строку в целое число и использовать двоичные операции над целым числом.

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