#java #c
#java #c
Вопрос:
Я провел несколько небольших тестов по коду, просто чтобы вернуться к своему кодированию после окончания, но этот вопрос поставил меня в тупик. Вот в чем вопрос:
Задано число n и два целых числа p1, p2 определяют, совпадают ли биты в позициях p1 и p2 или нет. Основаны на позициях p1, p2 и 1.
Пример
22,3,2 будет истинным, потому что это 0001 0110, потому что позиции 2 и 3 одинаковы.
Я решил это одним способом, который заключается в преобразовании десятичной системы счисления в двоичную, а затем в строку и проверке, совпадают ли биты в позициях, но я чувствую, что есть более простой способ сделать это с помощью битовых манипуляций, но я не очень хорошо в этом разбираюсь. Я подумал, что если бы я мог просто сдвинуть биты в первую позицию и сравнить их, я мог бы получить ответ, но затем я столкнулся с проблемой, когда я сдвигаю их на сдвиг влево, поскольку они просто переполняются.
Комментарии:
1. Я жду, когда первый Java-специалист опубликует ответ, который решит проблему с помощью строк..
2. @Nils, по-видимому, именно так это сделала операционная система…
3. Ха-ха-ха, да, я использовал Java-способ, который работает, но я хотел бы сделать это более эффективным способом.
Ответ №1:
Вы могли бы сместить интересные биты в наименее значимую позицию, а затем замаскировать все остальные биты с помощью amp;
.
Предполагая, что p1
и p2
являются индексами на основе нуля, отсчитываемыми от младшего значащего бита:
bool same_bits = (((n >> p1) amp; 1) == ((n >> p2) amp; 1))
Комментарии:
1. erm, p1 и p2 имеют индекс 1.. возможно, захотите исправить свой ответ
2. @Nim: Поскольку вопрос помечен
homework
, корректировка индексов на основе одного оставлена в качестве упражнения для читателя 😉3. Я увидел вашу правку после того, как прокомментировал, из-за чего мой комментарий выглядит немного глупо .. ну что ж…
4. Спасибо, это мне очень помогает. Я знал, что должен выполнить маскировку, но просто не знал как
5. @K.T если этот ответ — то, что вы ищете, нажмите на зеленую галочку, чтобы принять его и отдать должное @sth.
Ответ №2:
int bitPositionsSame(uint32_t n, uint32_t p1, uint32_t p2) {
uint32_t i1 = (n amp; (1 << p1)) >> p1;
uint32_t i2 = (n amp; (1 << p2)) >> p2;
return (i1 == i2);
}
Комментарии:
1.
p1
иp2
основаны на единице, и это не выполняется для двух (совпадающих) нулевых битов.2. По-прежнему обрабатываются
p1
иp2
как основанные на нуле. 🙂3. 🙂 это не то, что я исправил 🙂 🙂 🙂 🙂 🙂 🙂 Читателю действительно нужен ответ на основе нулевого индекса, они просто не знают этого, потому что они только что закончили школу.
4. Вот почему они называют меня Оракулом. Все эти комментарии являются смайликами. Я делаю людей счастливыми. Я надеюсь, что все эти разные ответы помогут вам, K.T. Простая просьба о сравнении битовых полей дает много результатов — еще один отличный результат этого вопроса. Подождите… нас подвергают мета-допросу?
Ответ №3:
Я думаю, вы можете сделать
(((0x1 << p1) amp; n) == 0) == ((( 0x1 << p2) amp; n) == 0)
Это создаст битовую маску 1 в качестве бита p1 / p2, а затем применит ее к числу. Затем мы проверяем, равны ли оба нулю или нет, и сравниваем результат.
Не могу проверить, так как я сейчас не перед компьютером, но я думаю, что это должно сработать 🙂
Редактировать: Пока я печатал свой ответ, некоторые другие люди набирали быстрее…
Комментарии:
1. Не будет работать для совпадающих
1
битов, иp1
иp2
основаны на единицах.
Ответ №4:
в C:
#define SAMEBIT(n, p1, p2)
((n >> (p1-1)) amp; (n >> (p2-1)) amp; 1)
в Smalltalk:
(n bitAt:p1) = (n bitAt:p2)
в Java:
like C
Комментарии:
1. Я не знал, что java поддерживает макросы !?! 😉
Ответ №5:
Вы можете сделать это с помощью битовых масок и amp;
(побитового оператора and). Вы создаете две битовые маски — одну для p1
и другую для p2
— сдвигая 1
бит в правильное положение с помощью <<
(shift left). Замаскируйте n
каждую битовую маску и сравните результаты.
Ответ №6:
предполагается, что 0 основано на старшем значащем бите (т. Е. знаковый бит равен 0)
boolean bitPositionsSame(int n, int p1, int p2) {
return (n amp; 0x80000000>>>p1)==(n amp; 0x80000000>>>p2);
}
Ответ №7:
Получите p1
бит n
:
(n >> (p1-1)) amp; 1
Получите p2
бит n
:
(n >> (p2-1)) amp; 1
Сравните их на равенство:
bool result = ((n >> (p1-1))amp;1) == ((n >> (p2-1))amp;1)
Ответ №8:
Вот еще один вариант:
bool same_bits = !(n amp; p1 - 1) == !(n amp; p2 - 1);
Принудительное изменение типа результата побитового И to bool
с !
ограничивает возможные значения только 0
или 1
.