SORU
22 NİSAN 2009, ÇARŞAMBA


Dairesel kayma (döndürme) işlemleri için en iyi uygulamalar C

Ve operatörler (&;< lt; ve >sağa sola kayma >zaten C mevcuttur . Ancak, dairesel kayma veya işlemleri gerçekleştirmek döndürmek nasıl bir şey bulamadım.

Nasıl operasyonlar gibi "Sola" ve "Sağa Döndür" gerçekleştirilecek? Döndür

Dönen doğru iki kez burada

Initial --> 1000 0011 0100 0010

neden:

Final   --> 1010 0000 1101 0000

Bir örnek yararlı olacaktır.

(Editörün notu: daha sadece bir tek daha makine talimat döndürmek için C döner eğer döndürmek sayısı sıfır veya derleme ise tanımsız davranış muzdarip dile getiren Birçok ortak yollar. Bu soruya cevabı en iyi uygulamalar belgesi gerekir.)

CEVAP
22 NİSAN 2009, ÇARŞAMBA


Tüm ayrıntılar için this answer on another rotate question bkz.

En derleyici dostu ifade etmek için bir yol Tanımsız Davranış John Regehrgibi görünüyor önler C Döndür'nin uygulanması:

#include <stdint.h>   // for uint32_t
#include <limits.h>   // for CHAR_BIT
// #define NDEBUG
#include <assert.h>

uint32_t rotl32 (uint32_t n, unsigned int c)
{
  const unsigned int mask = (CHAR_BIT*sizeof(n)-1);

  assert ( (c<=mask) &&"rotate by type width or more");
  c &= mask;  // avoid undef behaviour with NDEBUG.  0 overhead for most types / compilers
  return (n<<c) | (n>>( (-c)&mask ));
}

uint32_t rotr32 (uint32_t n, unsigned int c)
{
  const unsigned int mask = (CHAR_BIT*sizeof(n)-1);

  assert ( (c<=mask) &&"rotate by type width or more");
  c &= mask;  // avoid undef behaviour with NDEBUG.  0 overhead for most types / compilers
  return (n>>c) | (n<<( (-c)&mask ));
}

Herhangi bir işaretsiz tamsayı türü için çalışır, değil sadece uint32_t, diğer boyutları için sürüm yapabilirsin. Bu sürüm inlines to a single rol %cl, reg (rol $imm8, reg) 86, derleyici çünkü talimat zaten maske operasyonu yerleşik olduğunu bilir.

İşlenen türü, farklı genişlikleri ile işlev için özel uygulama dışında bu şablon karşı tavsiye ederim. Yanlışlıkla 32 bit 16 bit bir değer int geçici depolanan varken döndürmek yapmak istemiyorum. Özellikle tamsayı-terfi ettiğinden beri bir kural ifadesi int dar imzasız bir türü içeren sonuç açabilirsiniz.

n ve dönüş değeri için işaretsiz tür kullandığınızdan emin olun, ya da başka bir döndürme olmayacak. (x 86 gcc sağ vardiya aritmetik, işaret-bit yerine sıfır kopyalarını değişen, iki kaymıştır OR birlikte değerleri ne zaman bir sorun için lider yapar. Sağ vardiya negatif imzalı tamsayı tanımlı uygulama C. davranışlar)


(Bu cevap eski sürümü MSVC-belirli bir satır içi C sürümü için kanamayla sadece 32 bit x 86 kod için çalışır), veya http://www.devx.com/tips/Tip/14043 önerdi. Yorumlar bu cevap verme.)

Bazı Derleyiciler döndüğü için ön tanımlı sağladığını düşünüyorum, eğer bu sürümü hedefleme sen derleyici iyi kod üretmek değilse bile olmayan taşınabilir bir seçenek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • Vortez

    Vortez

    27 Temmuz 2009