БлогNot. 28, битовый крест

28, битовый крест

Вообще-то, вчера надо было это написать.

28-е, число кармы и воздаяния. Только для тех, кто способен выдержать преднамеренноcть или пусть даже злонамеренность бытия по отношению к себе, вместе с тем, понимая, что у бытия в этом нет ничего личного, просто бизнес карма.

"Я знаю, почему у меня такая карма, и я ценю, что я до сих пор жив и проповедую" - как сказал один знакомый :)

Итак, 1+2+3+4+5+6+7=28, (28/7+7)*7=77, совершенное число, карточная игра и многое другое, вот только отдельной статьи в "Лурке" пока нет, хоть и 28 + 28/2 же.

И сказал Господь Моисею, говоря: повели сынам Израилевым и скажи им: наблюдайте, чтобы приношение Мое, хлеб Мой в жертву Мне, в приятное благоухание Мне, приносимо было Мне в свое время.

Числа, 28

Ну а "на самом деле" 28 похоже на битовый крест, вот такой:

28, битовый крест из 4 байт
28, битовый крест из 4 байт

Если игроки, например, ходят по очереди своими 2-байтовыми числами, то выиграет тот, кто после пары ходов занял центр большим количеством единичек?

Нет, очень примитивно тогда. Учитывая, что центр заполняется по принципу "исключающего ИЛИ" (1 на 1 и 0 на 0 дают 0, иначе 1), то первому игроку достаточно будет ходить, например, числом 0x1818 (6168, единички в позициях центра), а второму числом 0xe7e7 (59367, нули в позиции центра, чтобы сохранить единички первого игрока).

Так что пусть это будет просто способ изобразить слегка искажённые 4 байта. Консольная программа выполнялась в Studio 2019, вроде бы, всё так.

#include <iostream>
#include <cstdint>
using namespace std;

class BitCross {
 unsigned char lines[4];
 uint16_t uz (unsigned char c) {
  return (uint16_t)c == 0 ? 0 : 1;
 }
public:
 BitCross(uint16_t first, uint16_t  second) {
  lines[0] = (unsigned char)((first & 0xff00u) >> 8);
  lines[1] = (unsigned char)(first & 0x00ffu);
  lines[2] = (unsigned char)((second & 0xff00u) >> 8);
  lines[3] = (unsigned char)(second & 0x00ffu);
 }
 BitCross(unsigned char c[4]) {
  for (int i=0; i<4; i++) lines[i] = c[i];
 }
 void show() {
  unsigned char place;
  unsigned int bit, num;
  //верх
  for (bit = 0, place = 0x01; bit < 3; bit++) {
   cout << "   ";
   cout << uz(lines[0] & place);
   cout << uz(lines[1] & place);
   cout << "   " << endl;
   place <<= 1;
  }
  unsigned char cross[2][2] = {
   { uz(lines[0] & 0x08u), uz(lines[1] & 0x08u) },
   { uz(lines[0] & 0x10u), uz(lines[1] & 0x10u) }
  };
  //горизонтали
  for (num = 2; num < 4; num++) {
   for (bit = 0, place = 0x80u; bit < 3; bit++) { cout << uz(lines[num] & place); place >>= 1; }
   cout << (cross[num - 2][0] ^ uz(lines[num] & 0x10u));
   cout << (cross[num - 2][1] ^ uz(lines[num] & 0x08u));
   for (bit = 5, place = 0x04u; bit < 8; bit++) { cout << uz(lines[num] & place); place >>= 1; }
   cout << endl;
  }
  //низ
  for (bit = 5, place = 0x20u; bit < 8; bit++) {
   cout << "   ";
   cout << uz(lines[0] & place);
   cout << uz(lines[1] & place);
   cout << "   " << endl;
   place <<= 1;
  }
  cout << endl;
 }
};

int main() {
 BitCross b(0x1818u, 0xe7e7u);
 b.show();

 unsigned char letters[4] = { 'P','e','r','S' };
 BitCross c(letters);
 c.show();

 return 0;
}
   00
   00
   00
11111111
11111111
   00
   00
   00

   01
   00
   01
01110010
01000011
   01
   11
   00

теги: личное числа программирование c++ эзотерика

29.06.2020, 20:10; рейтинг: 23