Пример #1
0
// まず、スタックから整数を二つ取り出し積を計算する
// 次に、計算結果をスタックに積む
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");                          //  普通の掛け算のコード生成
}
Пример #2
0
int main()
{
  int n;
  scanf("%d",&n);
  isPower2(n)?printf("Power of 2\n"):printf("Not power of 2\n");
  return 0;
}
Пример #3
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");                           //  普通の割り算のコード生成
}
Пример #4
0
// まず、スタックから整数を二つ取り出し商を計算する
// 次に、計算結果をスタックに積む
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");                           //  普通の割り算のコード生成
}