powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C: Bitwise Operators
20 сообщений из 20, страница 1 из 1
C: Bitwise Operators
    #39963802
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю, как работать с битовыми операторами ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
&    bitwise AND
¦    bitwise inclusive OR
^    bitwise exclusive OR
~    one’s complement (unary)

Что, например, тут происходит? Просьба расписать поподробнее!

1) n = n & 0177;
2) x = x & ~077
3) x = x ¦ 15 

4) функция из КР
Код: plaintext
1.
2.
3.
4.
5.
6.
/* getbits:  get n bits from position p */

unsigned getbits(unsigned x, int p, int n)
{    
    return (x >> (p+1-n)) & ~(~0 << n);
}
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39963816
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут что не понятно? https://ru.wikipedia.org/wiki/Битовая_операция
пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// Example program
#include <iostream>
#include <bitset>
#include <climits>

int main() 
{
    char num = 32;
    
    std::cout << "255 & 53 =" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255) << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(53) << std::endl;
    std::cout << "\t" << "--------" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255 & 53) << " = " << (255 & 53) << std::endl;
    std::cout << std::endl;
    
    std::cout << "255 & ~53 =" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255) << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(~53) << " (~53)" << std::endl;
    std::cout << "\t" << "--------" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255 & ~53) << " = " << (255 & ~53) << std::endl;
}


вывод программы
255 & 53 =
11111111
00110101
--------
00110101 = 53

255 & ~53 =
11111111
11001010 (~53)
--------
11001010 = 202
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39963829
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
не понимаю, как работать с битовыми операторами
...
4) функция из КР
...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
// Example program
#include <iostream>
#include <bitset>
#include <climits>


/* getbits:  get n bits from position p */
unsigned getbits(unsigned x, unsigned p, unsigned n)
{    
    std::cout << "getbits("<< x<< "," << p << "," << n << ");" << std::endl; 
    
    std::cout << "~0 =" << std::endl;
    std::cout << std::bitset<sizeof(~0) * CHAR_BIT>(~0) << std::endl;
    std::cout << "(~0 << n) =" << std::endl;
    std::cout << std::bitset<sizeof(~0 << n) * CHAR_BIT>(~0 << n) << std::endl;
    std::cout << "~(~0 << n) =" << std::endl;
    std::cout << std::bitset<sizeof(~(~0 << n)) * CHAR_BIT>(~(~0 << n)) << std::endl;
    std::cout << std::endl;
    
    std::cout << "x =" << std::endl;
    std::cout << std::bitset<sizeof(x) * CHAR_BIT>(x) << std::endl;
    std::cout << "(x >> (p+1-n)) =" << std::endl;
    std::cout << std::bitset<sizeof(x >> (p+1-n)) * CHAR_BIT>(x >> (p+1-n)) << std::endl;
    std::cout << std::endl;
    std::cout << "(x >> (p+1-n)) & ~(~0 << n) = " << std::endl;
    std::cout << std::bitset<sizeof(~(~0 << n)) * CHAR_BIT>(~(~0 << n)) << std::endl;
    std::cout << std::bitset<sizeof(x >> (p+1-n)) * CHAR_BIT>(x >> (p+1-n)) << std::endl;
    std::cout << "--------------------------------" << std::endl;
    std::cout << std::bitset<sizeof((x >> (p+1-n)) & ~(~0 << n)) * CHAR_BIT>((x >> (p+1-n)) & ~(~0 << n)) << "  (" << ((x >> (p+1-n)) & ~(~0 << n)) << ")" << std::endl;
    
    return (x >> (p+1-n)) & ~(~0 << n);
}


int main() 
{
    std::cout << getbits(1234567890, 10, 6);
}


вывод программы
getbits(1234567890,10,6);
~0 =
11111111111111111111111111111111
(~0 << n) =
11111111111111111111111111000000
~(~0 << n) =
00000000000000000000000000111111

x =
01001001100101100000001011010010
(x >> (p+1-n)) =
00000010010011001011000000010110

(x >> (p+1-n)) & ~(~0 << n) =
00000000000000000000000000111111
00000010010011001011000000010110
--------------------------------
00000000000000000000000000010110 (22)
22
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39963847
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы "Bitwise" переводил как "побитовые", т.к. это ближе к смыслу. Суть в том что операнды рассматриваются как массивы битов и операция происходит отдельно для каждого бита.
Значение 1 рассматривается как true и дальше по аналогии с логическими операциями.

Для рассмотрения конкретных значений надо их представлять в двоичном виде и дополнять нулями до нужной разрядности.
Например uint8_t (разрядность 8 бит)
Код: plaintext
1.
2.
3.
177 = 1011 0001
 77 = 0100 1101
 177|77= 
253 = 1111 1101
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39963916
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab

1) n = n & 0177;

Здесь справа стоит восьмеричная константа. Надо быть осторожным т.к. мы часто ошибочно ее видим глазами.

По смыслу это похоже на выделение в n групп битов по 3 штуки. Как в Unix файловых правах.
Например 177 (восьмеричной) => 001 111 111 в двоичной.

Тоесть после этой операции если n = 010 010 101 результат будет пересечением битов тоесть 000 010 101.

Честно я не вижу особого смысла в наше время юзать восьмеричку. В bash например ее элегантно
заменяют символические привилегии (chmod u+rwx) например для владельца поставить все три битика.
И так просто и понятно. И когда Unix админ лупит три семерки - это такой себе кич. Дай бох он сможет
в голове проинтерпретирвоать более сложную маску.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964011
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, Dima_T, mayton

спасибо ! каждый ответ добавил что-то новое !

и теперь я, наконец, разберусь в побитовых операциях.
(обычно этот раздел я всегда пропускала) :-)
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964038
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, это таже Булева алгебра, но только поразрядно для двоичной системы счисления.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964182
mayton
И когда Unix админ лупит три семерки - это такой себе кич. Дай бох он сможет
в голове проинтерпретирвоать более сложную маску.

hex в помощь
YouTube Video
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964399
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза, зачем мне это? Это - поверхностно.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964432
а по-моему весьма глубоко
даёт отличное понимание, как биты работают
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964438
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы в школе играли в конспирологию. Записочками перекидывались. Ну придумывали секретный язык
из закорючек чтоб учителя не поняли. И я тогда выучил двоичный код.

Но если вы работаете в баше и вам надо дать доступ к группе например на запись - то самый лучший вариант
это chmod +gr. А не игры в уме с дизъюнкцией. Еще напутаете. А это - прод. И вас накажут. За неряшливость.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964494
будто бы +gr нельзя напутать с +gw
если ты неряшлив, ты всегда найдёшь где напутать
а понимать, что FF это на самом деле 1111 + 1111, это важно.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964502
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
а понимать, что FF это на самом деле 1111 + 1111, это важно.

Детский сад какой-то
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964535
а я вот уверен, что явисты и питоны не в курсе.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964541
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,
FF = 11111111, а 1111+1111 = 11110 = 1E
совет автор дает правильный, к 16чной системе нужно привыкнуть
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964543
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
Алексей Роза
а понимать, что FF это на самом деле 1111 + 1111, это важно.

Детский сад какой-то

Да у Алексея Розы вообще бардак какой-то в голове. Впрочем, есть мнение, что у истинно творческих людей всегда бардак в голове. Но обратное неверно. Те у кого бардак в голове не всегда являются истинно творческими людьми. :)
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп оффтоп.
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39964566
mini.weblab
FF = 11111111, а 1111+1111 = 11110 = 1E

+ в данном случае это пробел
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39969254
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, зачем привыкать к 16-тиричной системе счисления при изучении битовых операций, использующих двоичную систему? :)
...
Рейтинг: 0 / 0
C: Bitwise Operators
    #39969258
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mini.weblab, зачем привыкать к 16-тиричной системе счисления при изучении битовых операций, использующих двоичную систему? :)

Это как езда на велосипеде без рук. Понты колотить можно.

Но с другой стороны держать в голове табличку типа 0xF = 1111(b), 0xE = ... e.t.c.
это очень полезно по жизни. Всегда есть легаси язык или среда где нет нативной
поддержки двоичной системы.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C: Bitwise Operators
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]