Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49

Найти последовательность единичных битов

25.07.2025, 12:33. Показов 2004. Ответов 17

Студворк — интернет-сервис помощи студентам
Есть битовая карта в виде массива uint8_t:
C
1
uint8_t bitmap[SIZE]
Существует ли способ быстро находить последовательности единичных битов, например "111", "11111" и т.д. произвольного размера (не выходящего за рамки SIZE), с возвратом индекса бита в битовой карте, с которого начинается последовательность?
Решение в лоб - это побитовый подсчёт, плюс обработка границ байтов, когда часть последовательности находится в одном байте, а часть в другом (или в случае uint8_t запросто может находиться в трёх, четырёх, большем количестве байт.
Существуют ли более эффективные решения?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2025, 12:33
Ответы с готовыми решениями:

Количество единичных битов
Название Размерность Тип D 16 вход C 5 ...

Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе
Здравствуйте, уважаемые мастера программирования. Нуждаюсь в вашей помощи. Написать функцию,...

Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе
Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе,...

17
228 / 169 / 71
Регистрация: 14.06.2024
Сообщений: 458
25.07.2025, 12:38
предварительно строку собрать?
0
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
25.07.2025, 12:51  [ТС]
Без строк, если имеются в виду последовательности ascii-симовлов.
Ну условно если в виде функции, то примерно так:
C
1
2
3
4
5
6
7
8
9
int find_bit_pattern(uint8_t bitmap* /*ну или из внешней переменной*/, int len){
    // len - длина последовательности единичных бит
    // или сразу маску, это не принципиально
    int index; // индекс начала такой последовательности
 
    // процесс поиска    
 
    return index; // возвращаем индекс
}
Под самими битовыми последовательностями подразумеваются настоящие биты в uint8_t. То есть один элемент массива есть 8 бит, а не представление 1 бита.
Если SIZE = 2, то битовая карта может иметь напримеп вот такой вид:
1100'0001 1110'1010

И в ней может потребоваться найти последовательность 1111, нужно получить её индекс (в данном случае 7).
0
2732 / 887 / 330
Регистрация: 10.02.2018
Сообщений: 2,095
25.07.2025, 14:00
Eltan, в видео кодеках часто используют битовые структуры для более компактного размещения данных. К примеру некая структура занимает 5 бит и она не обязана лежать в начале байта, часть структуры может в одном байте лежать, а часть в другом. Куча разных битовых структур последовательно слеплены вместе и всё это образует битовый поток. Можно поискать в реализации кодеков некие интересные идеи. В кодеке h264 есть такое понятие как стартовая последовательность бит, вроде "0...01". И есть алгоритм поиска ближайшей стартовой последовательности с произвольного места битового потока. Чем-то похоже на вашу задачу.

Я особо не вникал в тонкости реализации. В общих чертах там есть две основные идеи. Первая идея, делается специальный класс, который позволяет последовательно забирать из битового потока нужное количество бит как целое число выровненное по началу байта. В таком классе используются разные оптимизации и кэширования, что несколько ускоряет работу с битовым потоком. Вторая идея, при поиске последовательности можно шагать не по одному биту, а сразу через несколько бит, но нужно смотреть на искомую и проверяемую последовательности. К примеру, если мы ищем "11111", а текущее проверяемая последовательность "xxxx0", то можно шагнуть сразу на 5 бит, так как младший '0' отсекает возможность появления нужной последовательности ранее.
1
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
25.07.2025, 14:20  [ТС]
Да, последний момент тоже пришёл сразу в голову, такая оптимизация с перешагиванием заведомо невалидных последовательностей тоже желаема. Спасибо, погуглю.
0
Заблокирован
25.07.2025, 14:37
Лучший ответ Сообщение было отмечено Eltan как решение

Решение

Цитата Сообщение от Eltan Посмотреть сообщение
плюс обработка границ байтов
Какая обработка границ?
C++
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
#include <iostream>
#include <cstdint>
#include <climits>
 
size_t find_bit_seq(std::uint8_t* bitmap, std::size_t size, std::size_t length){
   if (length > size*CHAR_BIT)
      return size;
   for(std::size_t bit = 0, bitseq = 0, byte = 0; byte != size; ++byte){
      for(std::uint8_t b = 1 << (CHAR_BIT - 1); b != 0; b >>= 1, ++bit){
         if (bitmap[byte] & b)
            ++bitseq;
         else
            bitseq = 0;
         if (bitseq == length)
            return bit + 1 - length;
      }
   }
   return size;
}
 
int main(){
   const std::size_t SIZE = 2;
   std::uint8_t bitmap[SIZE] = {
      0b11000001,
      0b11101010
   };
   size_t pos = find_bit_seq(bitmap, SIZE, 4);
   if (pos == SIZE)
      std::cout << "not found";
   else
      std::cout << "found at : " << pos;
   std::cout << std::endl;
}
А вообще можно заюзать std::vector<bool> и пусть двое из ларца за тебя пальцы загибают.

Добавлено через 4 минуты
C (Си)
Ой, пардоньте за мой французкий....

Добавлено через 2 минуты
Цитата Сообщение от Ygg Посмотреть сообщение
можно шагать не по одному биту, а сразу через несколько би
Сомнительно.
1
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
25.07.2025, 15:05  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Какая обработка границ?
Действительно, ничего подобного в такой постановке не требуется, меня что-то сбило на эту мысль.
0
Заблокирован
25.07.2025, 17:13
Цитата Сообщение от SmallEvil Посмотреть сообщение
return size;
Кстати, тут имелось ввиду возвращать количество всех бит в наборе(size*CHAR_BIT) а не байт... Если последовательность не найдена.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 05:07
Если читать из восьмибитного массива,
шестнадцатибитным типом данных (указатель *short),
передвигая его побайтно, наверное можно
сделать поиск непрерывным. (Переход через границу между ячейками массива)
Цитата Сообщение от SmallEvil Посмотреть сообщение
вообще можно заюзать std::vector<bool>
Решение должно быть низкоуровневым. (Это си. И такие вещи делают на си.)
(Думать надо... Неделю...)
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 13:28
Цитата Сообщение от Eltan Посмотреть сообщение
Существуют ли более эффективные решения?
Нашёл где спросить... И время подобрал правильное.
У меня с побитовыми операциями вообще провал... Изучать надо.
Несколько раз изучал, что то особо не пристаёт... (Надо что бы по улице идёшь, и в голове решалось)
Биты вообще то в числах ищуться, а не в массивах...

Добавлено через 2 минуты
Цитата Сообщение от Eltan Посмотреть сообщение
способ быстро находить
Да ещё и быстро...
Со словом быстро, все с++ фантазии как бы отметаються сразу.

Добавлено через 25 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
сделать поиск непрерывным
Здесь не поиск. Здесь единички считать....
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 15:27
С какой долей абстракции это решать то?
C++
1
2
uint8_t bitmap[SIZE] = {
0b11000001,0b11101010,0b00001100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000011,0b11100000,0b00000000,0b00000000,0b00000000
};
Оно там всё раком развёрнуто. Конец одного с началом второго не совпадает...


Когда читаешь указателем short, первый и второй байт меняет местами. (индексация)
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 15:48
Долбить разворачивая, или долбить напрямую?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    const size_t SIZE = 12;
    
    uint8_t bitmap[SIZE] = {
0b11000001,0b11101010,0b00001100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000011,0b11100000,0b00000000,0b00000000,0b00000000
    };
uint8_t *ptr = &bitmap[0];
 
    for (short j = 0; j < SIZE; ++j) {
        for (int i = 7; i >= 0; --i) {
            if (*ptr & (1 << i))
                printf("%c", '1');
            else printf("%c", '0');
        }
        ++ptr;
        }
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 15:51

Можно посчитать единички,
последовательности единичек... С этим нет проблем.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 19:33
Щитает...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    const size_t SIZE = 12;
    uint8_t bitmap[SIZE] = {
0b11000001,0b11101010,0b00001100,0b00000000,0b00000000,0b00000000,
0b00000000,0b00000011,0b11100000,0b00000000,0b00000000,0b00000000
    };
uint8_t *ptr = &bitmap[0];// int покрывает четыра байта сразу
unsigned short sdf{};
unsigned short indx{};
 
for (short j = 0; j < SIZE; ++j) {
    for (int i = 7; i >= 0; --i) {
        if (*ptr & (1 << i)) {
            ++sdf;
        } else {
            printf("index-%u --- count %u\n  ", indx - sdf, sdf); sdf = 0;
             }
        ++indx;
    }
    ++ptr;
}
getchar();
}
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
26.07.2025, 19:35
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
03.08.2025, 08:55
Цитата Сообщение от Eltan Посмотреть сообщение
Есть битовая карта в виде массива uint8_t:
C
1
uint8_t bitmap[SIZE]
Существует ли способ быстро находить последовательности единичных битов, например "111", "11111" и т.д. произвольного размера (не выходящего за рамки SIZE), с возвратом индекса бита в битовой карте, с которого начинается последовательность?
Я не вижу осмысленной постановки задачи. Что нужно сделать? Что дано? Что значит "произвольного размера"? Размер дан или не дан? И если размер дан, то что именно нужно найти, если последовательностей такого размера не одна?
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 962
15.08.2025, 12:50
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я не вижу осмысленной постановки задачи. Что нужно сделать? Что дано? Что значит "произвольного размера"? Размер дан или не дан? И если размер дан, то что именно нужно найти, если последовательностей такого размера не одна?
задача сформулирована криво, но как будто надо понимать так:
есть массив байт, который представляет последовательность бит. нужно найти в нем непрерывную последовательность бит заданной длины и вернуть "битовый адрес" с которого начинается последовательность.

не хочу писать код полностью, просто поделюсь идеей:
C++
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
int leftDictionary[255]; // сколько единиц вначале
int rightDictionary[255]; //сколько единиц вконце
 
int position[6][256]; // если есть непрерывная последоваетльность до 6 байт строго внутри байта, то будет битовый адрес, иначе -1
 
 
int find_bit_seq(uint8_t* bitmap, int arraySize, int length)
{
    int continuesSequenceLength = 0; // текущая длина непрерыной последовательности байт
    int startIndex = 0; // индекс начала непрерывной последовательности 
    int canFullContainsInByte = length<7;
    for (int i=0; i<arraySize; i++)
    {
        int currentByte = bitmap[i];
        if (currentByte == 0xFF) // 8 единиц - продолжаем считать
        {
            continuesSequenceLength += 8;
            continue;
        }
        continuesSequenceLength += leftDictionary[currentByte]; // в последовательности есть хоть один ноль, значит добавить число бит из начала
        if (continuesSequenceLength == length)
            return startIndex;
        if (canFullContainsInByte && position[length][currentByte]>0) // если последоваетльность коротка, то проверить есть ли строго в середине байта.
            return i*8 + position[length][currentByte];
        continuesSequenceLength = rightDictionary[currentByte]; // начать отсчитывать новую непрерывную последоваетельность байт с конца.
        startIndex = (i+1)*8 - continuesSequenceLength;
        
    }
    
    if (continuesSequenceLength == length)
    return startIndex;
}
идея в том, что компьютер все равно будет читать минимум побайтно (а может и больше) у каждого байта есть сколько единиц вначале, сколько-то единиц в конце (заранее для каждого байта вычислить) и только у 0xff все единицы. можно читать побайтно и следить сколько байт насчиталось если искать последовательность бит длиной 6 и мение, то последоваетльность может быть целиком внутри, для этого надо заполнить массив position. писать код по заполнению константами массивов лень, лучше его в инициализацию перенести для быстроты работы.
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
24.08.2025, 14:46
Цитата Сообщение от Eltan Посмотреть сообщение
Существует ли способ быстро находить последовательности единичных битов, например "111", "11111" и т.д. произвольного размера (не выходящего за рамки SIZE), с возвратом индекса бита в битовой карте, с которого начинается последовательность?
Не озвучена платформа, на которой должен выполняться код. Все низкоуровневые оптимизации - платформозависимые. Так как используют возможности системы команд CPU.

Если в вашем массиве преобладают единичные биты, а биты ='0' - встречаются редко и если речь о платформе x86, то для ускорения поиска можно воспользоваться одной из функций: _BitScanForward(), _BitScanForward64(), _BitScanReverse(), _BitScanReverse64().
https://learn.microsoft.com/en... w=msvc-170
При макс. оптимизации такая функция транслируется в единственную команду CPU = BSR или BSF.
Простой код:
C++
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <cassert>
#include <intrin.h>
#include <stdint.h>
#include <stdio.h>
#include "type.h"
 
#define __packed
#pragma pack(push, 1)
typedef unsigned long u32p8;
#pragma pack(pop)
 
//#define ncell(m) (sizeof(m) / sizeof((m)[0]))
 
struct BitmapPad {
  enum {SIZE = 256};
  u32 data[(SIZE + 3) / 4];
  u32 pad;
  int BitsFind(int len);
} bitmapPad;
 
int BitmapPad::BitsFind(int len)
{
  assert(len && len < 33);
  ulong i0, i1;
  pad = 0;
  if (SIZE & 3) data[ncell(data) - 1] = data[ncell(data) - 1] << 32 - (SIZE & 3) * 8 >> 32 - (SIZE & 3) * 8;
  u32 mask = (1 << len) - 1;
  u32 *p = (u32 *)&data[0];
  u32 j, j0 = *p++, j1;
  uint n = ncell(data);
  do {
    for (j1 = *p++; _BitScanForward(&i0, j0); j0 = j0 << i0) {
      j0 >>= i0;
      if (!(mask & ~(j0 | j1 << 32 - i0))) return ((u8 *)p - (u8 *)&data[2]) * 8 + i0;
      _BitScanForward(&i1, ~j0);
      i0 += i1;
      j0 >>= i1;
    }
    j0 = j1;
  } while (--n);
  return -1;
}
 
int main()
{
  int i;
 
  memset(&bitmapPad, 0, sizeof(bitmapPad));
  *(u32p8 *)&bitmapPad.data[32] = 31 << 7;
  i = bitmapPad.BitsFind(5);
  if (i < 0) printf("1. Not found\n");
  else printf("1. Found at bit = %u\n", i);
 
  memset(&bitmapPad, 0, sizeof(bitmapPad));
  *(u32p8 *)((u8 *)&bitmapPad.data[32] + 3) = 31 << 5 | 15;
  i = bitmapPad.BitsFind(5);
  if (i < 0) printf("2. Not found\n");
  else printf("2. Found at bit = %u\n", i);
 
  memset(&bitmapPad, 0, sizeof(bitmapPad));
  *(u32p8 *)((u8 *)&bitmapPad.data[32] + 3) = 15 << 5 | 15;
  i = bitmapPad.BitsFind(5);
  if (i < 0) printf("3. Not found\n");
  else printf("3. Found at bit = %u\n", i);
 
  return 0;
}
Компилим, запускаем, получаем результат:
1. Found at bit = 1031
2. Found at bit = 1053
3. Not found
т.е. - всё ок.

По листингу видно, что главный цикл (прохода по u32-словам) - довольно короткий и без вызовов функций:
Code
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
39
40
41
42
43
44
45
...
               L8:                                                                        
0058 83C204      addl  $4, %edx                                                           
005b 89F8        movl  %edi, %eax                                                         
005d 8B7AFC      movl  -4(%edx), %edi                                                     
               L7:                                                                        
               /APP                                                                       
                # 1205 "c:\prg\gcc\x86\i686-pc-mingw32\include\psdk_inc\intrin-impl.h" 1  
0060 0FBCF0      bsfl %eax,%esi                                                           
                # 0 "" 2                                                                  
               /NO_APP                                                                    
0063 7439        je  L4                                                                   
0065 89F1        movl  %esi, %ecx                                                         
0067 D3E8        shrl  %cl, %eax                                                          
0069 B9200000    movl  $32, %ecx                                                          
     00                                                                                   
006e 8945E4      movl  %eax, -28(%ebp)                                                    
0071 29F1        subl  %esi, %ecx                                                         
0073 89F8        movl  %edi, %eax                                                         
0075 D3E0        sall  %cl, %eax                                                          
0077 8B4DE4      movl  -28(%ebp), %ecx                                                    
007a 09C1        orl %eax, %ecx                                                           
007c F7D1        notl  %ecx                                                               
007e 854DDC      testl %ecx, -36(%ebp)                                                    
0081 7508        jne L5                                                                   
0083 29DA        subl  %ebx, %edx                                                         
0085 8D44D6C0    leal  -64(%esi,%edx,8), %eax                                             
0089 EB1B        jmp L1                                                                   
               L5:                                                                        
008b 8B45E4      movl  -28(%ebp), %eax                                                    
008e F7D0        notl  %eax                                                               
               /APP                                                                       
                # 1205 "c:\prg\gcc\x86\i686-pc-mingw32\include\psdk_inc\intrin-impl.h" 1  
0090 0FBCC8      bsfl %eax,%ecx                                                           
                # 0 "" 2                                                                  
               /NO_APP                                                                    
0093 8B45E4      movl  -28(%ebp), %eax                                                    
0096 D3E8        shrl  %cl, %eax                                                          
0098 01F1        addl  %esi, %ecx                                                         
009a D3E0        sall  %cl, %eax                                                          
009c EBC2        jmp L7                                                                   
               L4:                                                                        
009e 3955E0      cmpl  %edx, -32(%ebp)                                                    
00a1 75B5        jne L8
...
Значит должно работать быстро. Здесь скомпилено под 32-битную платформу. Можно переписать код на 64-битные операции и с _BitScanForward64() - тогда работать будет быстрее.
Здесь скомпилено с оптимизацией по размеру (чтобы получить листинг покороче). Но автор может сделать компиляцию с оптимизацией по скорости - тоже всё работает.

Если платформа = ARM, то на ней тоже есть подходящая команда: CLZ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.08.2025, 14:46
Помогаю со студенческими работами здесь

Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе.
Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе....

Битовые операции: количество нулевых и единичных битов в целом неотрицательном числе
Вывести количество нулевых и единичных битов в целом неотрицательном числе.

Перевод таблицы битов и времени в последовательность битов arduino
доброго времени суток в приведенной ниже таблице левый столбец - биты, правый - их длительность....

Заменить n левых битов числа x на n левых битов числа y (не могу найти ошибку в коде)
Написать функцию, заменяющую n левых битов числа x на n левых битов числа y. Провести вычисление...

Написать функцию, заменяющую n левых битов числа x на n правых инвертированных битов числа y
Написать функцию, заменяющую n левых битов числа x на n правых инвертированных битов числа y....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru