Бінарне згортання


15

Двійкова згортання описується числом Mі застосовується до числа N. Для кожного біта у двійковому поданні M, якщо біт встановлений ( 1), відповідний біт у виводі задається шляхом XORing двох бітів, що примикають до відповідного біта N(обмотування, коли це необхідно). Якщо біт не встановлений ( 0), то відповідний біт у висновку задається відповідним бітом в N.

Робочий приклад (з 8-бітовими значеннями):

  1. Нехай N = 150, M = 59. Їх бінарні репрезентації складають (відповідно) 10010110та 00111011.
  2. На основі Mбінарного подання 'біти 0, 1, 3, 4 і 5 згортаються.
    1. Результат для біта 0 дає XORing біти 1 і 7 (оскільки ми обертаємось), поступаючись 1.
    2. Результат для біта 1 задається бітами XORing 0 і 2, поступаючись 0.
    3. Результат для біта 2 задається початковим бітом 2, поступаючись 1.
    4. Результат для біта 3 задається бітами XORing 2 і 4, поступаючись 0.
    5. Результат для біта 4 дає біти XORing 3 і 5, поступаючись 0.
    6. Результат для біта 5 дається бітами XORing 4 і 6, поступаючись 1.
    7. Результати для бітів 6 і 7 даються вихідними бітами 6 і 7, отримуючи 0і 1.
  3. Вихід таким чином 10100110( 166).

Змагання

Беручи під увагу , Nі M, вихідний результат виконання двійковій згортки , описаний Mна N. Введення та вихід можуть бути у будь-якому зручному, послідовному та однозначному форматі. Nі Mзавжди буде знаходитись у діапазоні (включно) [0, 255](8-бітні цілі числа), а їх двійкові представлення мають бути замінені на 8 біт для виконання двійкової згортки.

Випробування

150 59 -> 166
242 209 -> 178
1 17 -> 0
189 139 -> 181
215 104 -> 215
79 214 -> 25
190 207 -> 50
61 139 -> 180
140 110 -> 206
252 115 -> 143
83 76 -> 31
244 25 -> 245
24 124 -> 60
180 41 -> 181
105 239 -> 102
215 125 -> 198
49 183 -> 178
183 158 -> 181
158 55 -> 186
215 117 -> 198
255 12 -> 243

Я думаю, що назва неправильна. це має бути "Бінарна революція" :)
РудольфДжелін

Відповіді:



9

Python 2, 35 байт

lambda m,n:n^m&(n^n*257/2^n*2^n>>7)

Здається, це не працює n=255?
Ніл

@Neil Хороший улов. Я не бачу приємного способу обійти це з модом, замість цього на додатковий байт.
xnor

2

J, 34 байти

2#.[:({"_1],._1&|.~:1&|.)/(8#2)#:]

Прямий підхід, який застосовує процес, визначений у виклику. Приймає дані як масив [n, m].

Форми сім смайликів, [:, :(, :1, (8, 8#,#: , і :].

Використання

   f =: 2#.[:({"_1],._1&|.~:1&|.)/(8#2)#:]
   f 150 59
171
   f 59 150
166
   f 209 242
178
   f 17 1
0
   f 139 189
181

Щось має бути не так, якщо J
набере так

2

машинний код x64, 17 байт

88CD88C8D0C9D0C530E930C120D130C8C3

Розібрано:

0:  88 cd                   mov    ch,cl
2:  88 c8                   mov    al,cl
4:  d0 c9                   ror    cl,1
6:  d0 c5                   rol    ch,1
8:  30 e9                   xor    cl,ch
a:  30 c1                   xor    cl,al
c:  20 d1                   and    cl,dl
e:  30 c8                   xor    al,cl
10: c3                      ret

Підходить для конвенції виклику Win64 (аргументи в rcx, rdx).


1

Haskell, 66 байт

import Data.Bits
n%m=n.&.(255-m)+(rotate n 1`xor`rotate n(-1)).&.m

Працює за призначенням, коли викликається Word8даними. Замініть (255-m)на complement m(+5 байт), щоб функція працювала з будь-яким непідписаним інтегральним типом даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.