iT邦幫忙

0

C語言function 改寫成C#

//convert (x,y) to d
int xy2d (int n, int x, int y) {
    int rx, ry, s, d=0;
    for (s=n/2; s>0; s/=2) {
        rx = (x & s) > 0;
        ry = (y & s) > 0;
        d += s * s * ((3 * rx) ^ ry);
        rot(s, &x, &y, rx, ry);
    }
    return d;
}
 
//convert d to (x,y)
void d2xy(int n, int d, int *x, int *y) {
    int rx, ry, s, t=d;
    *x = *y = 0;
    for (s=1; s<n; s*=2) {
        rx = 1 & (t/2);
        ry = 1 & (t ^ rx);
        rot(s, x, y, rx, ry);
        *x += s * rx;
        *y += s * ry;
        t /= 4;
    }
}
 
//rotate/flip a quadrant appropriately
void rot(int n, int *x, int *y, int rx, int ry) {
    if (ry == 0) {
        if (rx == 1) {
            *x = n-1 - *x;
            *y = n-1 - *y;
        }
 
        //Swap x and y
        int t  = *x;
        *x = *y;
        *y = t;
    }
}

小弟是程式新手,對於指標還不是很熟悉
希望有大大可以教學一下
汗

看更多先前的討論...收起先前的討論...
外獅佬 iT邦大師 1 級 ‧ 2013-05-21 14:32:21 檢舉
C#也是有指標的....
外獅佬 iT邦大師 1 級 ‧ 2013-05-21 14:41:22 檢舉
C#要使用指標,請在各個函數前,加上unsafe關鍵字。
elearnet iT邦新手 5 級 ‧ 2013-05-21 15:04:22 檢舉
!!!!!! 原來是unsafe
感謝大大
但是有一句 rx = (x & s) > 0;
這一句我看不大懂意思 這樣rx 到底結果會是啥?
外獅佬 iT邦大師 1 級 ‧ 2013-05-21 15:05:54 檢舉
這一行會出錯....
因為rx 的定義是int ,但是(x & x) > 0則是bool
外獅佬 iT邦大師 1 級 ‧ 2013-05-21 15:09:31 檢舉
包含指標以及unsafe,在編譯時,必須使用/unsafe參數編譯。
簡單一點的方法,就是在Visual Studio裡頭,將專案屬性中的『允許unsafe程式碼』選項打勾。
pajace2001 iT邦研究生 1 級 ‧ 2013-08-28 17:56:06 檢舉
unsafe 出現了~驚
可是這樣不就有把C#打回C++的感覺了嗎毆飛
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

12
外獅佬
iT邦大師 1 級 ‧ 2013-05-21 15:04:37
最佳解答
<pre class="c" name="code">
public static class C2CS
{
  unsafe public static int xy2d(int n, int x, int y)
  {
    int rx, ry, s, d = 0;
    for (s = n / 2; s > 0; s /= 2)
    {
      //C#的boolean並不等於int,故,使用三元運算式模擬C語言boolean的整數型態
      rx = (x & s) > 0 ? 1 : 0;
      ry = (y & s) > 0 ? 1 : 0;
      d += s * s * ((3 * rx) ^ ry);
      rot(s, &x, &y, rx, ry);
    }
    return d;
  }
  
  unsafe public static void d2xy(int n, int d, int* x, int* y)
  {
    int rx, ry, s, t = d;
    *x = *y = 0;
    for (s = 1; s < n; s *= 2)
    {
      rx = 1 & (t / 2);
      ry = 1 & (t ^ rx);
      rot(s, x, y, rx, ry);
      *x += s * rx;
      *y += s * ry;
      t /= 4;
    }
  }
 
  unsafe public static void rot(int n, int* x, int* y, int rx, int ry)
  {
    if (ry == 0)
    {
      if (rx == 1)
      {
        *x = n - 1 - *x;
        *y = n - 1 - *y;
      }
  
      int t = *x;
      *x = *y;
      *y = t;
    }
  }
}
看更多先前的回應...收起先前的回應...

不懂純推
拍手

總裁 iT邦好手 1 級 ‧ 2013-05-21 16:06:09 檢舉

不推不懂...暈

懂一些純推

Ethan Jhuang iT邦研究生 3 級 ‧ 2013-05-21 16:34:36 檢舉

推看起來好專業愛你灑花

外獅佬 iT邦大師 1 級 ‧ 2013-05-21 16:36:59 檢舉

et54987提到:
專業

Orzcopy & paste 再改小部分...汗

echen688 iT邦高手 1 級 ‧ 2013-05-21 16:39:25 檢舉

不純的砍頭....... (公路常見路標之一)...... 失神

賽門 iT邦超人 1 級 ‧ 2013-05-21 16:41:00 檢舉

純純的"推"...臉紅

ted99tw iT邦高手 1 級 ‧ 2013-05-21 19:55:05 檢舉

阿母啊,不就C差一個井號那A差那麼多...暈

我要發表回答

立即登入回答