Примеры библиотек или областей CS, которые делают много битовых манипуляций - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь узнать больше о байтах / битах и ​​применить их к сценариям реального мира. До сих пор я нашел, что эти темы имеют много общего с ними:

  • хэширования
  • сжатия
  • криптография
  • манипуляции с изображениями (фильтры и тому подобное)
  • прямой бит тиддлинга
  • буферы

Но категория "буферы" в значительной степени ограничена библиотекой методов для манипулирования / доступа к массивам битов. Манипулирование изображениями и сжатие / хеширование, кажется, имеют большое количество вещей, но мне интересно, какие другие основные категории вещей вы видите (т.е. какие основные библиотеки существуют там), где код является сверхнизкоуровневой битовой манипуляцией и выглядит как это :

var K = [
  0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD,
  0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC,
  0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019,
  0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118,
  0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE,
  0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2,
  0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1,
  0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694,
  ...
]

...

for (i = this.start; index < length && i < 128; ++index) {
  code = message.charCodeAt(index);
  if (code < 0x80) {
    blocks[i >> 2] |= code << SHIFT[i++ & 3];
  } else if (code < 0x800) {
    blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  } else if (code < 0xd800 || code >= 0xe000) {
    blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  } else {
    code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
    blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
    blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  }
}

То есть код не обязательно должен выглядеть в точности , как это, но вещи, где есть много битовых операций и целых чисел, над которыми работают (или с плавающей запятой, если это так). Было бы неплохо знать некоторые основные библиотеки, например, "ffmpeg", но в противном случае было бы полезно просто знать категории, чтобы начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...