[Homepage][BBS][Blog][YouTube][asablo]

エアーバリアブルBBS
新エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
ビットシフト演算子について
ブログは拝見させて頂いております。BBSは初投稿です。
早速ですが、XC8でビットシフト演算子がはじかれしまいます。
IDE Xは最新のV3.4、XC8はV1.37です。WINは10
シュミレーターでステップ実行すると飛ばされます。
unsigned char buf;

buf << 1;  //この行がスキップされる。

演算子に関しては標準Cに準拠だと思うのですが、当方
アセンブラが主なのでとんと検討がつきません。
どなたか暇な方、老いぼれにお付き合いしていただければ幸いです。
  • 老技師
  • 2016/09/24 (Sat) 18:36:51
Re: ビットシフト演算子について
老技師さん

はじめまして、nです。

これは、「bufから値を持ってきて、シフトレフトして、その演算の結果を捨てる」という記述です。
翻訳時の最適化によって、この記述のコードはオブジェクトに残りません。

bufに値を代入する等、演算結果を捨てずに使えば最適化で消えることはないでしょう。

buf<<=1;
  • n
  • 2016/09/25 (Sun) 23:18:35
Re: ビットシフト演算子について
nさん

はじめまして、ご協力感謝です。標準Cでは”i<<j”でシフトレフトだったので
代入演算子が必要とは気がつきませんでした。

一応方向が左だったので算術で代用したんですが(buf+=buf;)
LSBから取り出す時はどうしたらいいんだろうと悩んでいましたが、これでスッキリしました。

実は秋月のシリアル付きの7セグ表示のArduino用サンプルをPICに移植中だったのです。
SPI.transfer(digits[j]+1);
を関数化し(spi_transfer(buf));

void spi_transfer(unsigned char buf){
  unsigned char i,j;
  for(i=0;i<=7;i++){
    adi =(bitflg == 0x80);
    sck = 1;
    for(j=0;j<=5;j++);
    sck = 0;
    buf << 1;         //ここで引っかかりました。笑
    }
  • 老技師
  • 2016/09/26 (Mon) 02:10:26

返信フォーム






プレビュー (投稿前に内容を確認)