Побитовые операторы в си
Пользователи, просматривающие топик: 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? Очень прошу помочь разобраться,потому как в книге Кернигана ничего не написано относительно этих чисел, откуда они беруться, да и вообще где они применимы.
|
|
|
Побитовые операторы в си - 2004-08-04 10:21:32
|
|
|
Pupkin-Zade
Сообщений: 9398
Оценки: 1489
Присоединился: 2004-03-10 13:54:16
|
Ууу батенька, вам двоичное исчисление нужно учить…
|
|
|
Побитовые операторы в си - 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
|
|
|
Побитовые операторы в си - 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;lt;&amp;lt; выполняется куда быстрее и проще(для CPU) чем оператор присваивания &amp;quot;=&amp;quot; или &amp;quot;:=&amp;quot;(если по паскалю че варишь)<BR> —————-
Вот тут ты не прав. Эта операция вааще исполнятся не будет. Будет исполнятся ее аналог в машинном коде. И тут есть один момент. Все нормальные компиляторы проводят такую оптимизацию сами. По крайней мере MSVC++ начиная с 6.0 точно. Более того они пытаются разложить константы… x / 640 = x / (512 + 128) = x / 512 + x / 128 = x >> 9 + x >> 7. Вот…
|
|
|
Побитовые операторы в си - 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 тормозит-с…
|
|
|
Побитовые операторы в си - 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 тормозит-с… (хотя умножение/деление медленнее, конечно!)
|
|
|
Побитовые операторы в си - 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>Вот тут ты не прав. Эта операция вааще исполнятся не будет. Будет исполнятся ее аналог в машинном коде. <BR>И тут есть один момент. Все нормальные компиляторы проводят такую оптимизацию сами. По крайней мере MSVC++ начиная с 6.0 точно. Более того они пытаются разложить константы… x / 640 = x / (512 + 128) = x / 512 + x / 128 = x >> 9 + x >> 7. Вот…<BR>*/————————————————–<BR> Ты чё, собрался придераться к словам чтоли? "операция вааще исполнятся не будет"… Без тебя знаю что в итоге всю машинные коды переводится и никаких там "=" "+" "main()" не будет.[sm=mad.gif]
|
|
|
Побитовые операторы в си - 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;gt;&amp;gt; &amp;lt;&amp;lt; в операциях <BR><BR>сложения? По моему это бредятина.<BR><BR>ЗЫ: &amp;gt;&amp;gt; &amp;lt;&amp;lt; везде при делении и умножении по кратности &amp;quot;2&amp;quot; !!!<BR><BR>
Че-т я тебя не понял. Ты сказал, что сдвиг выполняется быстрее присаивания. Я возразил. При чем тут вообще сложение и умножение? Может ты что-то другое имел ввиду, а я тебя не так понял?
|
|
|
Побитовые операторы в си - 2004-08-26 09:40:27
|
|
|
_vitusik
Сообщений: 31
Оценки: 0
Присоединился: 2004-08-04 12:35:32
|
А… теперь я понял чё ты имел ввиду… Ты хотел сказать (например) int i=j;//оттранслирует в одну команду mov //просто я в асм не силен, только С++
|
|
|
|
|