целые числа со знаком теперь ведут себя по-другому, в отношении сдвига влево?

Я знаю, что на несколько лет опаздываю на эту вечеринку, но я столкнулся с этим вопросом, пытаясь решить ту же проблему. Вы можете использовать внутренний поиск Eclipse программно, если вы пишете плагин Eclipse (и, таким образом, используете их кеширование и т. Д.), Чтобы найти классы, которые реализуют интерфейс. Вот мой (очень грубый) первый снимок:

  protected void listImplementingClasses( String iface ) throws CoreException
  {
    final IJavaProject project = <get your project here>;
    try
    {
      final IType ifaceType = project.findType( iface );
      final SearchPattern ifacePattern = SearchPattern.createPattern( ifaceType, IJavaSearchConstants.IMPLEMENTORS );
      final IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
      final SearchEngine searchEngine = new SearchEngine();
      final LinkedList<SearchMatch> results = new LinkedList<SearchMatch>();
      searchEngine.search( ifacePattern, 
      new SearchParticipant[]{ SearchEngine.getDefaultSearchParticipant() }, scope, new SearchRequestor() {

        @Override
        public void acceptSearchMatch( SearchMatch match ) throws CoreException
        {
          results.add( match );
        }

      }, new IProgressMonitor() {

        @Override
        public void beginTask( String name, int totalWork )
        {
        }

        @Override
        public void done()
        {
          System.out.println( results );
        }

        @Override
        public void internalWorked( double work )
        {
        }

        @Override
        public boolean isCanceled()
        {
          return false;
        }

        @Override
        public void setCanceled( boolean value )
        {
        }

        @Override
        public void setTaskName( String name )
        {
        }

        @Override
        public void subTask( String name )
        {
        }

        @Override
        public void worked( int work )
        {
        }

      });

    } catch( JavaModelException e )
    {
      e.printStackTrace();
    }
  }

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

1
задан Nicol Bolas 18 January 2019 в 14:35
поделиться

1 ответ

Формулировка C ++ 17 для знаковых сдвигов влево (E1 << E2) была:

В противном случае, если E1 имеет тип со знаком и неотрицательное значение, и E1 × 2 E2 представляется в соответствующем типе без знака типа результата, тогда это значение, преобразованное в тип результата, является результирующим значением; в противном случае поведение не определено.

Формулировка C ++ 20 для целых чисел как со знаком, так и без знака:

Значение E1 < < E2 - это уникальное значение, равное E1 × 2 E2 по модулю 2 N , где N - показатель диапазона типа результата.

По сути, это одно и то же; разница в том, что теперь он работает, если E1 отрицателен. «Показатель диапазона» - это, в основном, число битов в типе (показатель диапазона для 16-разрядного целого числа со знаком равен 16).

Сдвиг влево не сдвинулся в бит знака, и все еще не сдвинулся.

0
ответ дан Nicol Bolas 18 January 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: