查看完整版本 : 程式中,if else 重要D,定 + - X /重要D?

煙民母親生賤種 2019-2-17 12:26 AM

程式中,if else 重要D,定 + - X /重要D?

如果規定要放棄一樣,你揀邊樣? :fst_002:

鄉貢仁 2019-2-17 08:21 AM

少用if 是優化程式的做法。

用+-代替*/ 是優化程式的做法。

if 一定差過4則混算。

alee001 2019-2-17 12:14 PM

[quote]原帖由 [i]鄉貢仁[/i] 於 2019-2-17 08:21 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=494977083&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
少用if 是優化程式的做法。

用+-代替*/ 是優化程式的做法。

if 一定差過4則混算。 [/quote]

C兄可否給個例子參考及比較?

鄉貢仁 2019-2-17 12:37 PM

[quote]原帖由 [i]alee001[/i] 於 2019-2-17 12:14 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=494984791&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


C兄可否給個例子參考及比較? [/quote]
[url]https://segmentfault.com/a/1190000004829656[/url]

乘-可以用加 (2x5) 用 (5+5)
除-可以用減 (4/2) 用 (4-2)

xianrenb 2019-2-17 04:05 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2019-2-17 12:26 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=494970316&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
如果規定要放棄一樣,你揀邊樣? :fst_002: [/quote]

應該是要 + - * / 。
不過理由不是那麼明顯。

所有電腦程式甚至電子硬件的 digital operation ,都可以用 NAND (gate) 達成。
而如果 1 代表 logic 1 , 0 代表 logic 0 的話,對於 input x 及 input y 來說, x NAND y = NOT (x AND y)。
x AND y 可以用 x * y 代替。
而 NOT x 可以用 (1 - x) 代替。
換言之,只要有 - * 兩種 operation ,理論上就必定可以代替任何 digital 運算。

不過呢,或者至少要有一個 main loop (當中可能用上 if),讓所有等效的 NAND (gate) 能不斷重複地運作,才可以做到所有可能的要求。

當然,上面只是按理論而討論。
顧及效能的話,無 if else 或 + - * / 其中一類的話,看來都不可能寫到正常的程式。

111x111=12321 2019-2-17 06:43 PM

唔係好明, 好似無替代.
(定係DOWHILE可代IF?)



+-X/無左, 可能係快思煮飯程式,
無左branching (IF), 咪一式過的四刖計數機?

xianrenb 2019-2-17 07:09 PM

[quote]原帖由 [i]111x111=12321[/i] 於 2019-2-17 06:43 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495002467&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
唔係好明, 好似無替代.
(定係DOWHILE可代IF?)



+-X/無左, 可能係快思煮飯程式,
無左branching (IF), 咪一式過的四刖計數機? [/quote]

都有可能有其他方式做到類似 main loop 的效果。
例如 JavaScript 可以在一個 function 的最尾,用 setTimeout() call 番自己。
咁就可以無限 loop 。

而應該有 d 程式語言本身是 parallel run 的。
例如可以模擬硬件的 Verilog 。

不過說到底,前面的做法,是玩野方法。
做到,但正路唔會咁做。

111x111=12321 2019-2-17 07:14 PM

[quote]原帖由 [i]xianrenb[/i] 於 2019-2-17 07:09 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495003549&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
都有可能有其他方式做到類似 main loop 的效果。
例如 JavaScript 可以在一個 function 的最尾,用 setTimeout() call 番自己。
咁就可以無限 loop 。

而應該有 d 程式語言本身是 parallel run 的。
例如可以模擬硬件的 Verilog 。

不過說到底,前面的做法,是玩野方法。
做到,但正路唔會咁做。 ... [/quote]我DO WHILE Condition出場唔係為LOOP, 係貪佢CONDITION DISCRIMINATION, 即係 IF的替代是DO WHILE.

alee001 2019-2-17 09:09 PM

x同/係+同-嘅關係小學已教過,但冇咗if可以用乜做邏輯分析呢...Case?T/F?1or0?

xianrenb 2019-2-18 12:15 PM

[quote]原帖由 [i]alee001[/i] 於 2019-2-17 09:09 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495008988&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
x同/係+同-嘅關係小學已教過,但冇咗if可以用乜做邏輯分析呢...Case?T/F?1or0? [/quote]

前面的說法,是當用電腦語言實作一堆模擬電子硬件來代替 CPU 。
CPU 都只是一堆 logic gates 。
所以可以用 NAND 達成。

而實際一點的話,其實無 if ,有些語言都可以用 switch 。
又或者能實現 branch table 的類似作法也行。
[url=https://en.wikipedia.org/wiki/Branch_table]https://en.wikipedia.org/wiki/Branch_table[/url]

111x111=12321 2019-2-18 12:58 PM

if 正是一種 switch
switch, 可能係一種 branching.

無論如何, 是基於 binary "decision".
脫離 +-x/ forward operation 的本質

sswroom 2019-2-18 01:35 PM

if else (conditional branch) 可以用Table branch取代
/ (Divide) 可以用*取代
* (Multiply) 可以用+和<<取代
- (Subtract) 可以用~和+取代

+ 才是較難取代.......

111x111=12321 2019-2-18 01:50 PM

[quote]原帖由 [i]sswroom[/i] 於 2019-2-18 01:35 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495037096&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
if else (conditional branch) 可以用Table branch取代
/ (Divide) 可以用*取代
* (Multiply) 可以用+和<<取代
- (Subtract) 可以用~和+取代

+ 才是較難取代....... [/quote]可否舉Table branch例子?

+-x/ 之間取代, 無諗過.:smile_13:
我當樓主意思是成SET、這一類取消.

sswroom 2019-2-18 02:07 PM

[quote]原帖由 [i]111x111=12321[/i] 於 2019-2-18 01:50 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495037745&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
可否舉Table branch例子?

+-x/ 之間取代, 無諗過.:smile_13:
我當樓主意思是成SET、這一類取消. [/quote][code]if (a == 1)
{
        TrueFunc();
}
else
{
        FalseFunc();
}[/code]可以變成:[code]void (*)() funcs[] = {FalseFunc, TrueFunc};
int tmp = (a - 1);
tmp = tmp | -tmp;
tmp = (tmp >> 31) + 1;
funcs[tmp]();[/code]

alee001 2019-2-18 02:13 PM

咁即係if, for, do, loop...全部都可以係function?難度只有四則運算符號才是語言基礎?

111x111=12321 2019-2-18 02:21 PM

似乎只係Low level e.g. assumbly lang的  goto (addr of var), 是真正的 "無decision / 無compare true or false" .


其他的 switch, 即係 brand table, 暗啞底在 test condition, make decision, hence 係度 if.
矛矛地.

sswroom 2019-2-18 02:32 PM

[quote]原帖由 [i]111x111=12321[/i] 於 2019-2-18 02:21 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495039059&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
似乎只係Low level e.g. assumbly lang的  goto (addr of var), 是真正的 "無decision / 無compare true or false" .


其他的 switch, 即係 brand table, 暗啞底在 test condition, make decision, hence 係度 if.
矛矛地. ... [/quote]是C++的語言限制, 我的寫法會Compile成:
call dword ptr [esp+funcs+eax*4]
如果直接寫Assembly, 可以寫:
jmp dword ptr [esp+funcs+eax*4]
只是因為C++不能Compile成Table Jump, 只能用Table Call取代, 速度會慢少少

111x111=12321 2019-2-18 02:47 PM

呢些都只係技術枝葉.

樓主問題意思範疇不明, 不能深究, 或可以有準確答案.

alee001 2019-2-18 04:15 PM

繁殖中,老頭重要D,定老母重要D?

alvin__luk 2019-2-18 05:51 PM

I'd pick the if else...




For demo only... Addition can be done as below:




//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static int GetPreviousNumber(int iValue)
        {
            switch (iValue)
            {
                case 0: return 9;
                case 1: return 0;
                case 2: return 1;
                case 3: return 2;
                case 4: return 3;
                case 5: return 4;
                case 6: return 5;
                case 7: return 6;
                case 8: return 7;
                case 9: return 8;
            }
            return -1;
        }
        
        public static int GetNextNumber(int iValue)
        {
            switch (iValue)
            {
                case 0: return 1;
                case 1: return 2;
                case 2: return 3;
                case 3: return 4;
                case 4: return 5;
                case 5: return 6;
                case 6: return 7;
                case 7: return 8;
                case 8: return 9;
                case 9: return 0;
            }
            return -1;
        }
        
        public static int Add(int iValue0, int iValue1)
        {
            if (iValue1 == 0)
                return iValue0;
            
            return Add (GetNextNumber (iValue0), GetPreviousNumber (iValue1));
        }
               
        public static void Main(string[] args)
        {
            //Your code goes here
            Console.WriteLine (string.Format ("Result = {0}", Add (1, 1)));
            
            Console.WriteLine (string.Format ("Result = {0}", Add (3, 4)));
            
            Console.WriteLine (string.Format ("Result = {0}", Add (2, 7)));
        }
    }
}




Output:

Compilation time: 0,16 sec, absolute running time: 0,11 sec, cpu time: 0,11 sec, average memory usage: 12 Mb, average nr of threads: 2, absolute service time: 0,3 sec

         




Result = 2
Result = 7
Result = 9

sswroom 2019-2-18 06:47 PM

[quote]原帖由 [i]alvin__luk[/i] 於 2019-2-18 05:51 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495048092&ptid=28039127][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
I'd pick the if else...




For demo only... Addition can be done as below:




//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.1792 ... [/quote]
Addition is not so complicated. Here is a simple version with conditional branch:[code]Int32 MyAdd(Int32 a, Int32 b)
{
    Int32 tmp;
    while (b != 0)
    {
        tmp = a & b;
        a = a ^ b;
        b = tmp << 1;
    }
    return a;
}[/code]

xianrenb 2019-2-18 07:28 PM

看來,兩類中缺任一類,其實都有可能寫到程式。

話時話,其實最近 d processor security bug ,好似就是用測量時間的方法可以 predict 到 if-else 走了那個 branch ,從而估算到某段 memory 的內容。
咁如果 d processor 無左像 if-else 的 branching ,只有 branch table 一類的,跳親都一樣時間,不就可以解決了?
頁: [1]
查看完整版本: 程式中,if else 重要D,定 + - X /重要D?