// まず、スタックから整数を二つ取り出し積を計算する // 次に、計算結果をスタックに積む void vmMul() { int n; if (topSta==CNST && (n=isPower2(topAux))>0) { // x * (2^n) なら topAux = n; // (n==0 は削除されているはず) cal("SHLA"); // x << n に置換える } else if (secSta==CNST && // (n=isPower2(secAux))>0) { // (2^n) * x なら secSta = topSta; // secAux = topAux; // x << n に置き換える topSta = CNST; // topAux = n; // cal("SHLA"); // } else rcal("MUL"); // 普通の掛け算のコード生成 }
int main() { int n; scanf("%d",&n); isPower2(n)?printf("Power of 2\n"):printf("Not power of 2\n"); return 0; }
// まず、スタックから整数を二つ取り出し剰余を計算する // 次に、計算結果をスタックに積む void vmMod() { int n; if (topSta==CNST && (n=isPower2(topAux))>0) { // x % (2^n) なら topAux = (1<<n) - 1; // (n==0 は削除されているはず) rcal("AND"); // x & ((1<<n)-1) に置換える } else cal("MOD"); // 普通の割り算のコード生成 }
// まず、スタックから整数を二つ取り出し商を計算する // 次に、計算結果をスタックに積む void vmDiv() { int n; if (topSta==CNST && (n=isPower2(topAux))>0) { // x / (2^n) なら topAux = n; // (n==0 は削除されているはず) cal("SHRA"); // x >> n に置換える } else cal("DIV"); // 普通の割り算のコード生成 }