C diliyle neredeyse DES algoritmasını uygulamam ve kodumu optimize etmek istiyorum. Bu yüzden gprof
kullandım.Sekiz 6 bitlik birimlerden oluşan 48 bitlik bir dize: her bir birimin orta kısmındaki 4 bitin nasıl hızlı bir şekilde alınacağı
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
51.78 9.32 9.32 8000000 1.17 1.17 sboxes
34.71 15.57 6.25 8000000 0.78 0.78 extendRight
9.90 17.35 1.78 500000 3.56 35.96 operation
2.39 17.78 0.43 8000000 0.05 0.05 xorRightAndKey
gprof
sboxes
fonksiyon 51.78% zamanın işgal olduğunu göstermektedir: İşte raporun parçasıdır.
sboxes(uchar aucData[6], ...)
'da, 48 bit verildi, bunları 8 yuvaya böl, 6 bitlik her yuva. Her yuva için
X
almak için son biraz ilk bit birleştirmek;Y
almak için orta 4 bit elde;
(X, Y)
; Örneğin
, 011110
böylece X = 00
ve Y = 1111
bir yuvadır. Burada (X, Y)
uchar basePos = 0x00;
for (int i = 0; i < 8; ++i) {
x = 0;
y = 0;
basePos = i * 6; // to locate the slot
// combine first bit with last bit
if (0 != GET_BIT(aucData, basePos)) {
x |= 0x02;
}
if (0 != GET_BIT(aucData, basePos + 5)) {
x |= 0x01;
}
// get continuous 4 bits
for (int j = 1; j <= 4; ++j) {
if (0 != GET_BIT(aucData, basePos + j)) {
y |= (0x01 << (4 - j));
}
}
// do something with (x, y)
}
Benim soru olduğunu almak için kod edilir
#define LOCATE(ptr, index) (((char *)(ptr))[(index) >> 3])
#define GET_BIT(ptr, index) (LOCATE((ptr), (index)) & (((uchar)0x80) >> ((index) % 8)))
Ve:
Bunu uygulamak için, ben bellekte/SET bit GET için MAKRO yazdım, burada göreceli bir koddur , 48 bit verildi, orta 4 bit mümkün olduğunca hızlı nasıl elde edilir? Arama tablosunda olmadan
Her biri 6 bit ise, bir arama tablosu yapabilir misiniz? – Robinson
Bir seçim: C veya C++. – fuz
Büyük olasılıkla, birden fazla bayt ve bir dizi olmayan bir dizi için ayrı ayrı optimize edilmiş rutinleri yazabilirsiniz. Bu, mevcut bit-by-bit yaklaşımından kaçınacaktır. – usr2564301