Побитовый оператор не работает как положено в C ++ - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь найти, есть ли в конкретной строке все уникальные символы или нет.Мой подход такой: я инициализирую 64-битную переменную, скажем мест и устанавливаю ее равной 0. Теперь я перебираю строку и вычисляю разницу междуASCII между текущим символом и 'A' (наименьший возможный ASCII).Если (place & (1 "<<" pos)) уже установлено, строка не имеет уникальных символов.</p>

Все отлично работает, но только со строчными буквами.В тот момент, когда я добавляю тест с заглавными буквами, код больше не работает.Я уверен, что это что-то с моей переменной мест , но я не знаю, что именно не так.

Вот код для того же:

#include <bits/stdc++.h>
using namespace std;

void check_unique(string s){
    int64_t places=0;       
    for(int i=0;i<s.length();i++){   
    int pos=s[i]-'A';            
    if((places & (1<<pos))!=0){  
        cout<<"String does not have all unique characters\n";   
        return;
    }
    places|=(1<<pos);            
  }
   cout<<"String has all unique characters\n";   
}

int main() {
    check_unique("abcde"); // Testcase 1
    check_unique("aabb");  // Testcase 2
    check_unique("ABbde");   // Testcase 3, Wrong output.
    return 0;
}

1 Ответ

0 голосов
/ 25 сентября 2018

В C ++ константы имеют тип, в вашем случае 1 имеет тип int, и кажется, что ваша платформа имеет 32-битные числа, поэтому при использовании строчных букв вы выходите за пределы диапазона.Очевидным решением является использование константы типа long - 1L или, что еще лучше, беззнакового long 1UL.Вы также можете использовать приведение:

static_cast<uint64_t>(1) << pos
...