Re: вопрос на собеседование
От: Molchalnik  
Дата: 03.02.16 08:14
Оценка: -1
Здравствуйте, uncommon, Вы писали:


U>Дано целое число. Как проверить, что все биты в нём равны 1 без перебора битов? (т.е. число есть 2^N-1, где N — неизвестно).


в арифметике типового процессора — сравнить с -1

второй вариант, более универсальный — побитовое xor со сравнением: x^(!x) == x
Re[2]: вопрос на собеседование
От: T4r4sB Россия  
Дата: 03.02.16 09:06
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>второй вариант, более универсальный — побитовое xor со сравнением: x^(!x) == x


1. Только не !x, а ~x
2. Тогда уж сразу ~x==0
Re[3]: вопрос на собеседование
От: Molchalnik  
Дата: 03.02.16 09:39
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>1. Только не !x, а ~x

это зависит от нотации

TB>2. Тогда уж сразу ~x==0

хорошо, уточню свою формулу, ( x^(!x) ) & x == x

Действительно, был неправ

And с результатом операции убирает неоднозначность операции битового инвертирования — ведь неочевидно и зависит от платформы/реализации, инвертит ли битовое инвертирование старшие биты, или нет

метод лучше x & (x+1) == 0 тем, что гарантирует отсутствие переполнения

впрочем, это без разницы, но раз вопрос сугубо теоретический
Re: вопрос на собеседование
От: CEMb  
Дата: 09.02.16 09:01
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Не столько на С++, сколько на сообразительность.


U>Дано целое число. Как проверить, что все биты в нём равны 1 без перебора битов? (т.е. число есть 2^N-1, где N — неизвестно).


А такой вариант был:

добавить 1 и посмотреть флаг переполнения

?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.