Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Побитовые операторы в си

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> Побитовые операторы в си
Имя
Сообщение << Старые топики   Новые топики >>
Побитовые операторы в си - 2004-08-04 00:23:25   
SeRj

Сообщений: 5
Оценки: 0
Присоединился: 2004-06-13 01:11:56
Привет Всем,
слушай, у меня возник глупый вопрос насчет Си. Вопрос
насчет побитовых операторов ( << >> | & ^).Ну насчет исключающего ИЛИ
понятно, его используют в XOR''е. А остальные? Зачем они
вообще нужны? Ну скажем при сдвиге вправо на один бит, обнуляются
разряды(только не пойму какие), а что мне это дает? И еще, а что
это такие за разряды в коде(где старшие, а где младшие). Скажем
почему x=x&~077 обнуляет в x последнии 6 разрядов? откуда это вообще все
взялось. Почему именно 077 , а не, скажем 444? Очень прошу
помочь разобраться,потому как в книге Кернигана ничего не
написано относительно этих чисел, откуда они беруться, да и
вообще где они применимы.
Post #: 1
Побитовые операторы в си - 2004-08-04 10:21:32   
Pupkin-Zade

Сообщений: 9398
Оценки: 1489
Присоединился: 2004-03-10 13:54:16

Ууу батенька, вам двоичное исчисление нужно учить…

Post #: 2
Побитовые операторы в си - 2004-08-04 13:26:41   
_vitusik

Сообщений: 31
Оценки: 0
Присоединился: 2004-08-04 12:35:32
Отвечаю только один раз(но с примерами):
операция поразрядного сдвига влево << сдвигает биты числа на n позиция в влево т.е.
100<<1
будет равно 1000(разумеется все в 2 с/с)
Эта операция приводит к увеличению исходного числа в два раза
т.е.
5<<2 будет равно 20 (10 с/с)
5<<2=5*4
5<<1=5*2
Для твоего сведения операция << выполняется куда быстрее и проще(для CPU) чем оператор присваивания "=" или ":="(если по паскалю че варишь)

>> - обратная операция, пояснять не буду

операция ^ (xor) меняет все биты в соответствии с маской
часто используется в шифровании(если захочешь пример то напиши _vitusik@rambler.ru)
ладно мне нана прогу доделать , может еще увидимся.
_vitusik
Post #: 3
Побитовые операторы в си - 2004-08-22 17:33:54   
ien

Сообщений: 18
Оценки: 0
Присоединился: 2004-08-20 00:12:46
quote:

—————-<BR>Цитата: Дата:04.08.2004 13:26:41, Автор:_vitusik :: <BR>Для твоего сведения операция &amp;amp;lt;&amp;amp;lt; выполняется куда быстрее и проще(для CPU) чем оператор присваивания &amp;amp;quot;=&amp;amp;quot; или &amp;amp;quot;:=&amp;amp;quot;(если по паскалю че варишь)<BR>
—————-


Вот тут ты не прав. Эта операция вааще исполнятся не будет. Будет исполнятся ее аналог в машинном коде.
И тут есть один момент. Все нормальные компиляторы проводят такую оптимизацию сами. По крайней мере MSVC++ начиная с 6.0 точно. Более того они пытаются разложить константы… x / 640 = x / (512 + 128) = x / 512 + x / 128 = x >> 9 + x >> 7. Вот…
Post #: 4
Побитовые операторы в си - 2004-08-22 23:49:59   
DeepThinker

Сообщений: 177
Оценки: 0
Присоединился: 2004-06-13 02:26:09
2 _vitusik: ты вдвойне неправ. = может оттранслироваться в одну инструкцию (mov reg, reg), если обе переменные перед этим были в регистрах (используются они часто, допустим). mov reg, reg выполнится на 4 пне за полтика, а shl reg, imm тормозит-с…
Post #: 5
Побитовые операторы в си - 2004-08-22 23:51:05   
DeepThinker

Сообщений: 177
Оценки: 0
Присоединился: 2004-06-13 02:26:09
2 _vitusik: ты вдвойне неправ. = может оттранслироваться в одну инструкцию (mov reg, reg), если обе переменные перед этим были в регистрах (используются они часто, допустим). mov reg, reg выполнится на 4 пне за полтика, а shl reg, imm тормозит-с… (хотя умножение/деление медленнее, конечно!)
Post #: 6
Побитовые операторы в си - 2004-08-25 11:33:43   
_vitusik

Сообщений: 31
Оценки: 0
Присоединился: 2004-08-04 12:35:32
quote:

—————-<BR>Цитата: Дата:22.08.2004 23:51:05, Автор:DeepThinker ::
2 _vitusik: ты вдвойне неправ. = может оттранслироваться в одну инструкцию (mov reg, reg), если обе переменные перед этим были в регистрах (используются они часто, допустим). mov reg, reg выполнится на 4 пне за полтика, а shl reg, imm тормозит-с… (хотя умножение/деление медленнее, конечно!)<BR>
—————-


А по твоему имеет смысл использовать >> << в операциях
сложения? По моему это бредятина.
ЗЫ: >> << везде при делении и умножении по кратности "2" !!!
quote:

<BR>/*————————————————–<BR>Вот тут ты не прав. &#1069;та операция вааще исполнятся не будет. Будет исполнятся ее аналог в машинном коде. <BR>И тут есть один момент. Все нормальные компиляторы проводят такую оптимизацию сами. По крайней мере MSVC++ начиная с 6.0 точно. Более того они пытаются разложить константы… x / 640 = x / (512 + 128) = x / 512 + x / 128 = x &gt;&gt; 9 + x &gt;&gt; 7. Вот…<BR>*/————————————————–<BR>

Ты чё, собрался придераться к словам чтоли?
"операция вааще исполнятся не будет"…
Без тебя знаю что в итоге всю машинные коды переводится и никаких там "=" "+" "main()" не будет.[sm=mad.gif]
Post #: 7
Побитовые операторы в си - 2004-08-25 16:01:41   
DeepThinker

Сообщений: 177
Оценки: 0
Присоединился: 2004-06-13 02:26:09
quote:

—————-<BR>Цитата: Дата:25.08.2004 11:33:43, Автор:_vitusik ::
quote:

—————-<BR><BR>Цитата: Дата:22.08.2004 23:51:05, Автор:DeepThinker ::
2 _vitusik: ты вдвойне неправ. = может оттранслироваться в одну инструкцию (mov reg, reg), если обе переменные перед этим были в регистрах (используются они часто, допустим). mov reg, reg выполнится на 4 пне за полтика, а shl reg, imm тормозит-с… (хотя умножение/деление медленнее, конечно!)<BR><BR>
—————-

<BR><BR>А по твоему имеет смысл использовать &amp;amp;gt;&amp;amp;gt; &amp;amp;lt;&amp;amp;lt; в операциях <BR><BR>сложения? По моему это бредятина.<BR><BR>ЗЫ: &amp;amp;gt;&amp;amp;gt; &amp;amp;lt;&amp;amp;lt; везде при делении и умножении по кратности &amp;amp;quot;2&amp;amp;quot; !!!<BR><BR>



Че-т я тебя не понял. Ты сказал, что сдвиг выполняется быстрее присаивания. Я возразил. При чем тут вообще сложение и умножение? Может ты что-то другое имел ввиду, а я тебя не так понял?
Post #: 8
Побитовые операторы в си - 2004-08-26 09:40:27   
_vitusik

Сообщений: 31
Оценки: 0
Присоединился: 2004-08-04 12:35:32
А… теперь я понял чё ты имел ввиду…
Ты хотел сказать (например)
int i=j;//оттранслирует в одну команду mov
//просто я в асм не силен, только С++
Post #: 9
Страниц:  [1]
Все форумы >> [Веб-программинг] >> Побитовые операторы в си







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.