İkili Evrişim


15

İkili evrişim bir sayı ile tanımlanır ve bir sayıya Muygulanır N. İkili gösterimdeki her bit için M, eğer bit ayarlanmışsa ( 1), çıkıştaki karşılık gelen bit, karşılık gelen bitin bitişiğindeki iki bitin XORingi ile verilir N(gerektiğinde sarılarak). Bit ayarlanmamışsa ( 0), çıkıştaki karşılık gelen bit, ilgili bit tarafından verilir N.

Çalışılan bir örnek (8 bit değerlerle):

  1. Let N = 150, M = 59. İkili sunumları (sırasıyla) 10010110ve 00111011.
  2. Mİkili gösterim temelinde 0, 1, 3, 4 ve 5 bitleri kıvrıktır.
    1. Bit 0 için sonuç XORing bit 1 ve 7 tarafından verilir (etrafa sarıldığımızdan beri), sonuç verir 1.
    2. Bit 1 için sonuç, sonuç veren XORing bitleri 0 ve 2 ile verilir 0.
    3. Bit 2 için sonuç, orijinal bit 2 tarafından verilir 1.
    4. Bit 3 için sonuç, XORing bitleri 2 ve 4 ile elde edilir 0.
    5. Bit 4 için sonuç, XORing bitleri 3 ve 5 ile elde edilir 0.
    6. Bit 5 için sonuç, XORing bitleri 4 ve 6 ile elde edilir 1.
    7. Bit 6 ve 7'nin sonuçları, orijinal bit 6 ve 7 tarafından verilir 0ve verir 1.
  3. Böylece çıktı 10100110( 166) olur.

Meydan okuma

Verilen Nve üzerinde Maçıklanan ikili evrişim gerçekleştirme sonucu çıktı . Giriş ve çıkış herhangi bir uygun, tutarlı ve açık olmayan biçimde olabilir. ve her zaman (kapsayıcı) aralıkta olacaktır (8 bit işaretsiz tam sayılar) ve ikili gösterimleri ikili evrişimi gerçekleştirmek için 8 bite kadar doldurulmalıdır.MNNM[0, 255]

Test Durumları

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

Bence başlık yanlış. "İkili Devrim" olmalı :)
RudolfJelin

Yanıtlar:


4

JavaScript (ES6), 31 bayt

(n,m)=>n^m&(n^(n*=257)>>1^n>>7)

9

Python 2, 35 bayt

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

Çalışmıyor gibi görünüyor mu n=255?
Neil

@Neil İyi yakala. Mod ile bunun etrafında hoş bir yol görmüyorum, bunun yerine ekstra bir bayt için değişiyor.
xnor

2

J, 34 bayt

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

Zorlukta tanımlanan süreci uygulayan basit bir yaklaşım. Girişi dizi olarak alır [n, m].

Formlar yedi suratlar, [:, :(, :1, (8, 8#, #:, ve :].

kullanım

   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 Python ile aynı puanları alırsa bir şeyler yanlış olmalı: D
PurkkaKoodari

2

x64 makine kodu, 17 bayt

88CD88C8D0C9D0C530E930C120D130C8C3

Demonte:

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 çağrı kuralı için uygundur (rcx, rdx'deki bağımsız değişkenler).


1

Haskell, 66 bayt

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

Verilerle çağrıldığında amaçlandığı gibi çalışır Word8. İşlevin imzasız tümleşik veri tipiyle çalışmasını sağlamak için (+5 bayt) (255-m)ile değiştirin complement m.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.