Преобразование с битовым сдвигом из C в Swift 3 с использованием Bool

#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. итак, решение, предложенное Хэмишем, было настолько простым и правильным, что я не знаю, почему я этого не попробовал. большое спасибо