LINUX.ORG.RU

Ответ на: комментарий от anonymous

Вы используете в работе поразрядные операции?
Если да, то привидете пожайлуста пример, если нетрудно вам.
Ежели трудно то проходите мимо.

P.S. книги есть. интересует вопрос применения данных операций.
Тобишь зачем они используются? В какого рода задачах.
У меня лично нету опыта их примения, поэтому и интересует данным вопрос.

SuperNoob
() автор топика

> поразрядные

битовые чтоли?

arsi ★★★★★
()
Ответ на: комментарий от SuperNoob

1) В системном программировании — всякие флаги, воспринимаемые процессором и прочим железом.

2) Можно ещё делать свои «структуры» с флагами для экономии места.

Ну и кусок кода:

 
...
a |= COOL_BIT;
...
if (a & COOL_BIT) {
   ...
} else {
  ...
}
... 
vkos ★★
()
Ответ на: комментарий от SuperNoob

Вы используете в работе поразрядные операции?

да

Если да, то привидете пожайлуста пример

практически любая работа с бинарными протоколами

jtootf ★★★★★
()
int len = (( response[0] & 0xff ) << 8) + (( response[1] & 0xff ));

вот тебе кусочек из кода. сойдёт за пример использования?

jtootf ★★★★★
()
int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

во, 5 бинарных операций, не? :)

arsi ★★★★★
()
Ответ на: комментарий от jtootf

за пример сойдет. вот только мне она ни о чем не говорит.
что в responce? и что вы хотите получиться в результате в len

SuperNoob
() автор топика
Ответ на: комментарий от SuperNoob

задача о 8-ми ферзях на доске 8×8. считай бинарные операции ;)

#include <stdio.h>
#define C(m,r) (((m) >> (3 * (r))) & 7)
#define T(v,b) ((v ^= (1 << (b))) & (1 << (b)))
int main() {
    int m, r, c;
    char t[] = "+---+---+---+---+---+---+---+---+\n|   |   |   |   |   |   |   |   |";
    for (m = 0; m < 077777777; ++m) {
        int d1 = 0, d2 = 0, v = 0;
        for (r = 0, c = C(m, 0); r < 8 && T(v, c) && T(d1, r + c) && T(d2, r + 7 - c); ++r, c = C(m, r));

        if (r == 8) {
            for (r = 0; r < 8; ++r) {
                int i = (C(m, r) << 2) + 36;
                t[i] = 'X';
                puts(t);
                t[i] = ' ';
            }
            puts("+---+---+---+---+---+---+---+---+\n");
        }
    }
    return 0;
}

arsi ★★★★★
()
Ответ на: комментарий от hizel
int len = (( response[0] & 0xff ) << 8) + (( response[1] & 0xff ));

если взять к примеру что

response[0] = 8; //1000
response[1] = 2; //0010
/* 0xFF шестнадцатиричное представление ~0 или двоичное 11111111 */

то получим

1) 1000 & 11111111 = 1000

2) << 8 = 1000 00000000

3) 0010 & 11111111 = 0010

4) результат 1000 00000010 (или в десятичной 2050)

правильно я посчитал?

вы уж простите. да я нуб и мне непонятно применение. :(

SuperNoob
() автор топика
Ответ на: комментарий от SuperNoob

т.е.
0xFF шестнадцатиричное представление
двоичное будет 11111111 и в дес 255

SuperNoob
() автор топика
Ответ на: комментарий от SuperNoob

видимо там не байты, а что-то большее и отрезается все кроме первого байта - &0xff

нам эту арифметику давали 10-ом классе на уроке информатики

hizel ★★★★★
()

Все быстрые преобразования используют битовые операции - начиная от умножения Карацубы и быстрых преобразований Фурье.

anonymous
()
Ответ на: комментарий от anonymous

> Этот ужас писал фанат Перла что ли?

как догадались? :)

arsi ★★★★★
()
Ответ на: комментарий от jtootf

> попробуй развернуть байты в слове без использования побитовых операций

имеется ввиду вывести строку в десятичном виде?

SuperNoob
() автор топика
      const int z80ccf[] = {fZ,fC,fPV,fS};
      return (((rF & (z80ccf[cc >> 1]) ) == 0)^(cc & 1));
madcore ★★★★★
()

Флаги.
#define FOO 1;
#defint BAR 2;
int flags = FOO | BAR;

urxvt ★★★★★
()
Ответ на: комментарий от jtootf

в принципе по ходу мне стало ясно насчет применения ...
особенно помог пример
маршалинга и
big endian и little endian

Всем спасибо.

SuperNoob
() автор топика
Ответ на: комментарий от anonymous

Плюсовик из меня еще тот, так что вот на С

# cat 1.c
#include <stdio.h>

inline void endian_swap(unsigned short *x) 
{
    unsigned char* y = (unsigned char*)x; 

    y[1] = y[0] + y[1]; 
    y[0] = y[1] - y[0]; 
    y[1] = y[1] - y[0]; 
}


int main(void) 
{
    unsigned short i = 0xffcc;

    printf("i =  %x\n", i);
    endian_swap(&i);
    printf("i =  %x\n", i);

    return(0);
}

# gcc 1.c && ./a.out
i =  ffcc
i =  ccff

anonymous
()

кто использует поразрядные операции и где

Да, я.

if (someVar & someBitMask)
    *(volatile unsigned int*) SOME_HW_ADDRESS |= anotherBitmask;
else
    *(volatile unsigned int*) SOME_HW_ADDRESS &= (~ anotherBitmask);

Управление железкой

yoghurt ★★★★★
()

реализация криптоалгоритмов

trex6 ★★★★★
()

Микроконтроллеры же

МК AVR, 8051... Все управление железом происходит через установку/сброс определенного бита в определенном регистре ввода/вывода.

...
void rs_485_send_byte(uint8 byte)
{
    PORTE |= (1<<PE3);
    while ( !( UCSR0A & (1<<UDRE0)) );
    UDR0 = byte;
}
...

Где PORTE, UCSR0A, UDR0 - те самые регистры ввода/вывода.

PE3, UDRE0 - номера бит.

Вообще в C было бы грустно без битовых операций.

microprogs
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.