Как я мог реализовать логическую импликацию с поразрядным или другим эффективным кодом в C?

Я нашел, что вы должны изменить номер в [].

	  var channelID = "MY-ID";
    var reqURL = "https://www.youtube.com/feeds/videos.xml?channel_id=";
    $.getJSON("https://api.rss2json.com/v1/api.json?rss_url=" + encodeURIComponent(reqURL)+channelID, function(data) {
       var link = data.items[0].link;
       var id = link.substr(link.indexOf("=")+1);
    $("#youtube_video").attr("src","https://youtube.com/embed/"+ id + "?controls=0&showinfo=0&rel=0");
		var link = data.items[1].link;
       	var id = link.substr(link.indexOf("=")+1);
    $("#youtube_video2").attr("src","https://youtube.com/embed/"+ id + "?controls=0&showinfo=0&rel=0");
		var link = data.items[2].link;
     	var id = link.substr(link.indexOf("=")+1);
    $("#youtube_video3").attr("src","https://youtube.com/embed/"+ id + "?controls=0&showinfo=0&rel=0");
	
    });
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>

<iframe id="youtube_video" width="600" height="340" frameborder="0" allowfullscreen></iframe>
<iframe id="youtube_video2" width="600" height="340" frameborder="0" allowfullscreen></iframe>
<iframe id="youtube_video3" width="600" height="340" frameborder="0" allowfullscreen></iframe>
	

9
задан alvatar 21 March 2009 в 03:28
поделиться

4 ответа

К вашему сведению, с gcc-4.3.3:

int foo(int a, int b) { return !a || b; }
int bar(int a, int b) { return ~a | b; }

Дает (от objdump-d):

0000000000000000 <foo>:
   0:   85 ff                   test   %edi,%edi
   2:   0f 94 c2                sete   %dl
   5:   85 f6                   test   %esi,%esi
   7:   0f 95 c0                setne  %al
   a:   09 d0                   or     %edx,%eax
   c:   83 e0 01                and    $0x1,%eax
   f:   c3                      retq   

0000000000000010 <bar>:
  10:   f7 d7                   not    %edi
  12:   09 fe                   or     %edi,%esi
  14:   89 f0                   mov    %esi,%eax
  16:   c3                      retq   

Так, никакие ответвления, но вдвое больше инструкций.

И еще лучше, с _Bool (спасибо @litb):

_Bool baz(_Bool a, _Bool b) { return !a || b; }
0000000000000020 <baz>:
  20:   40 84 ff                test   %dil,%dil
  23:   b8 01 00 00 00          mov    $0x1,%eax
  28:   0f 45 c6                cmovne %esi,%eax
  2b:   c3                      retq   

Так, использование _Bool вместо int хорошая идея.

Так как я обновляю сегодня, я подтвердил, что gcc 8.2.0 производит подобный, хотя не идентичный, результаты для _Bool:

0000000000000020 <baz>:
  20:   83 f7 01                xor    $0x1,%edi
  23:   89 f8                   mov    %edi,%eax
  25:   09 f0                   or     %esi,%eax
  27:   c3                      retq   
9
ответ дан 4 December 2019 в 06:57
поделиться
~p | q

Для визуализации:

perl -e'printf "%x\n", (~0x1100 | 0x1010) & 0x1111'
1011

В трудном коде это должно быть быстрее, чем"! p || q", потому что у последнего есть ответвление, которое могло бы вызвать останов в ЦП из-за ошибки предсказания ветвлений. Поразрядная версия детерминирована и, в качестве награды, может сделать в 32 раза больше работы в 32-разрядном целом числе, чем булева версия!

11
ответ дан 4 December 2019 в 06:57
поделиться
!p || q

много быстро. серьезно, не волнуйтесь об этом.

9
ответ дан 4 December 2019 в 06:57
поделиться

Можно читать при получении булевых выражений из таблиц истинности (также видят каноническую форму), о том, как можно выразить любую таблицу истинности как комбинацию булевых примитивов или функций.

4
ответ дан 4 December 2019 в 06:57
поделиться