#c #swift3 #bit-shift
#c #swift3 #битный сдвиг
Вопрос:
У меня есть фрагмент кода на C, и я пытаюсь преобразовать в swift
вот код C
long bitm;
long j;
long fftFrameSize = 2048;
for (i = 2; i < 2*fftFrameSize-2; i = 2) {
for (bitm = 2, j = 0; bitm < 2*fftFrameSize; bitm <<= 1) {
if (i amp; bitm){j ;}
j <<= 1;
}//eo for
}//eo for i = 2
Насколько я могу понять, мое замешательство заключается в том, что C bool также может быть длинным.
Вот моя попытка в swift
let fftFrameSize = 2048;
for i in stride(from: 2, to: 2*fftFrameSize-2, by: 2){
j = 0
bitm = 2;
while bitm < 2*fftFrameSize {
if (i % 2 == 0) { j = j 1}
j = j<<1
bitm<<=1
}//eo while
}//eo for i in
Я почти уверен, что код stride верен. Первый столбец в следующем — это то, что код C выдает для первых 33 значений j. Второй столбец — это то, что мой код выдает для первых 33 значений j. Значения для bitm совпадают в обоих, поэтому я не учел.
Спасибо за чтение
C S
2 2
4 6
8 14
16 30
32 62
64 126
128 254
256 510
512 1022
1024 2046
2048 4094
0 2
2 6
4 14
8 30
16 62
32 126
64 254
128 510
256 1022
512 2046
1024 4094
2 2
6 6
12 14
24 30
48 62
96 126
192 254
384 510
768 1022
1536 2046
3072 4094
Комментарии:
1.
if (i amp; bitm)
в вашем коде C по сравнениюif (i % 2 == 0)
с Swift???2. Чтобы прояснить комментарий Мартина. Код C
if (i amp; bitm)
проверяет, имеет лиi
по крайней мере те же биты, что иbitm
. Ваш Swift-кодif (i % 2 == 0)
проверяет, является лиi
четным.3. есть ли сопоставимое выражение, которое я могу использовать в swift. если я попытаюсь if (i amp; bitm) { j = j 1}, он скажет, что ‘Int’ не конвертируется в ‘Bool’, любая помощь будет оценена
4. @oldman Ты можешь сказать
i amp; bitm != 0
5. итак, решение, предложенное Хэмишем, было настолько простым и правильным, что я не знаю, почему я этого не попробовал. большое спасибо