Bit ağırlıklarını (LSB-MSB) ters çevirme

Başlatan OG, 20 Şubat 2007, 07:50:56

z

4 bit icin ugrastigina deymez. Shift komutlariyla yada tablo yontemi ile hemencecik bulabilirsin.

Matematiksel anlamda ugrasmak istiyorsan baska tabiki.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com


Icarus

@OG
a = (a & 0x55) << 1 | (a & 0xAA) >> 1;
a = (a & 0x33) << 2 | (a & 0xCC) >> 2;
a = (a & 0x0F) << 4 | (a & 0xF0) >> 4;

ipek

aradım ama bulamadım. eğer nible değilde 8 bit'in tümü  ise ,Ete hoca ~ şöyle bir şeyle tersliyordu.

muhittin_kaplan

~ ile bitwise terler

0000 01010 i 1111 1010 yapar 0 gördüğü yer 1 1 gördüğü yer 0 yazar MSB LSB çevrimi yapmaz

ete

MSB ile LSB değişimi yapılacak ise REV X komutu kullanılmalıdır.
X olarak 8 verirseniz sayının bitlerini yer değiştirir. Bitleri ters çevirecekseniz NOT işlemi uygulamak yeterli olur.
Örnek verelim;
A=%11000000
B=A REV 8=%00000011 olur
C=~A = %00111111  olur  (~işareti NOT operatörünün kısaltılmış şeklidir. Komut C=NOT A şeklinde de yazılabilir)

REV komutu parametresi Byte değişkenleri için 1-8 arası değer alır. Verilen rakam adedi kadar bit yer değiştirir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

M_B

Alıntı yapılan: ete - 05 Nisan 2014, 22:19:18
MSB ile LSB değişimi yapılacak ise REV X komutu kullanılmalıdır.
X olarak 8 verirseniz sayının bitlerini yer değiştirir. Bitleri ters çevirecekseniz NOT işlemi uygulamak yeterli olur.
Örnek verelim;
A=%11000000
B=A REV 8=%00000011 olur
C=~A = %00111111  olur  (~işareti NOT operatörünün kısaltılmış şeklidir. Komut C=NOT A şeklinde de yazılabilir)

REV komutu parametresi Byte değişkenleri için 1-8 arası değer alır. Verilen rakam adedi kadar bit yer değiştirir.

Ete
Ete hocam cozumunuz guzel ama ben basic kullanmıyorum.
burdaki konu bana yakın diye buraya yazdım.
şimdi REV komutunun c deki acılımını bulmak lazım ust mesajlarda arkadaslar bir şeyler yazmışlar onları deneyecem.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

muhittin_kaplan

#22
http://documentation.renesas.com/doc/products/mpumcu/apn/reg05b0008_h8slpap.pdf

mesaj birleştirme:: 06 Nisan 2014, 03:00:44

#include "stdio.h"

int main(void){
	unsigned char a;
	unsigned char temp;
	unsigned char z;
	a=0x07;
	char loop;
	for(loop=0;loop<3;++loop){
		
		z=a & 0x01;
		if (z == 0x01){
			temp |=0x01;
		}	
		temp=temp<<1;
		a=a>>1;
		
	}
	
while(1);
}


sanki çalışıyor, Kodlarım Çok Optimizedir Laf etmeyin.

acemi2010

Merhabalar;
C dilinde hiç iyi olduğumu söyleyemem; ancak aşağıdaki şekilde yapsak daha optimize birşeyler elde edebilirmiyiz diye geçti aklımdan bir an.
Kodları denemedim; yanlışlık olabileceği konusunda uyarmak isterim.

Saygılarımla
Timuçin

// 1010-1010 ==> 1010-0101

static union BYTEx{
    unsigned char mybyte;
    struct
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    }bits;
} BYTEx;

static union BYTEy{
    unsigned char mybyte;
    struct
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    }bits;
} BYTEy


// Main'e yazılacak komutlar
BYTEx.mybyte = 0xAA;
BYTEy.bits.bit0 = BYTEx.bits.bit3;
BYTEy.bits.bit1 = BYTEx.bits.bit2;
BYTEy.bits.bit2 = BYTEx.bits.bit1;
BYTEy.bits.bit3 = BYTEx.bits.bit0;
BYTEy.bits.bit4 = BYTEx.bits.bit4;
BYTEy.bits.bit5 = BYTEx.bits.bit5;
BYTEy.bits.bit6 = BYTEx.bits.bit6;
BYTEy.bits.bit7 = BYTEx.bits.bit7;
// Bu işlem sonucunda BYTEy.mybyte  A5 hex verisi olacaktır diye düşünüyorum

mehmet

MPLAB Simulatörde denedim...
/* 
 * File:   newmain.c
 * Author: mehmet
 *
 * Created on 07 Nisan 2014 Pazartesi, 01:35
 */

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>


//******************************************************************************
static union BYTEx
{
    unsigned char mybyte;
    struct
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    }bits;
} BYTEx;

static union BYTEy
{
    unsigned char mybyte;
    struct
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    }bits;
} BYTEy;
//******************************************************************************


//------------------------------------------------------------------------------
//-----LSB_to_MSB---------------------------------------------------------------
unsigned char LSB_to_MSB(unsigned char gelen)
{
    unsigned char giden;

    BYTEx.mybyte = gelen;

    BYTEy.bits.bit0 = BYTEx.bits.bit7;
    BYTEy.bits.bit1 = BYTEx.bits.bit6;
    BYTEy.bits.bit2 = BYTEx.bits.bit5;
    BYTEy.bits.bit3 = BYTEx.bits.bit4;
    BYTEy.bits.bit4 = BYTEx.bits.bit3;
    BYTEy.bits.bit5 = BYTEx.bits.bit2;
    BYTEy.bits.bit6 = BYTEx.bits.bit1;
    BYTEy.bits.bit7 = BYTEx.bits.bit0;

    giden = BYTEy.mybyte;
    return giden;
}

//------------------------------------------------------------------------------
//----Main----------------------------------------------------------------------
int main(int argc, char** argv)
{
    unsigned int deger = 0xAA;

    deger = LSB_to_MSB(deger);

    return (EXIT_SUCCESS);
}

//==============================================================================
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"