Re: как моменять местами слова в unsigned long не используя
От: GarikTot  
Дата: 12.11.03 08:28
Оценка: 21 (1) +1 -1
Здравствуйте, alexora, Вы писали:

A>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>киньте код плиз, что бы он работал в gcc

Есть POSIX'ные функции (хотя я видел реализации и в виде макросов)
htonl()
ntohl()

для конвертации из host порядка байт в сетевой и наоборот
Re[2]: как моменять местами слова в unsigned long не использ
От: aik Австралия  
Дата: 12.11.03 08:35
Оценка: 1 (1) +1 -1
Здравствуйте, GarikTot, Вы писали:

A>>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>>киньте код плиз, что бы он работал в gcc

GT>Есть POSIX'ные функции (хотя я видел реализации и в виде макросов)

GT>
GT>htonl()
GT>ntohl()
GT>

GT>для конвертации из host порядка байт в сетевой и наоборот

ответ неверный. ему надо чтобы 0x12345678 стало 0x56781234, а не 0x78563412.
Re[2]: как моменять местами слова в unsigned long не использ
От: aik Австралия  
Дата: 12.11.03 08:35
Оценка: -1
Здравствуйте, aik, Вы писали:

A>>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>>киньте код плиз, что бы он работал в gcc

aik>мда. а в студии подсмотреть, раз уж ты про них знаешь?


aik>#define LOWORD(l) ((WORD)(l))

aik>#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
aik>#define LOBYTE(w) ((BYTE)(w))
aik>#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))

а, ну собсно и это надо
#define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))

а дальше как в студии.
как моменять местами слова в unsigned long не используя мак
От: alexora  
Дата: 12.11.03 08:16
Оценка:
как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)
киньте код плиз, что бы он работал в gcc
Re: как моменять местами слова в unsigned long не используя
От: aik Австралия  
Дата: 12.11.03 08:24
Оценка:
Здравствуйте, alexora, Вы писали:

A>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>киньте код плиз, что бы он работал в gcc

мда. а в студии подсмотреть, раз уж ты про них знаешь?

#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
Re: как моменять местами слова в unsigned long не используя
От: Аноним  
Дата: 12.11.03 08:25
Оценка:
http://www.rsdn.ru/Forum/?mid=418691
Автор:
Дата: 22.10.03
Re: как моменять местами слова в unsigned long не используя
От: id  
Дата: 12.11.03 08:30
Оценка:
Здравствуйте, alexora, Вы писали:

A>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>киньте код плиз, что бы он работал в gcc

typedef struct tagLONG_WORDS{
unsigned short usLOW_WORD;
unsigned short usHIGH_WORD;
} LONG_WORDS;

typedef union _SWAP_WORDS{
unsigned long ulLONG;
LONG_WORDS lwLONG_WORDS;
} SWAP_WORDS;

SWAP_WORDS sw;
sw.ulLONG = <value>;

// TODO: method swap(unsigned short*, unsigned short*)
swap(sw.lwLONG_WORDS.usHIGH_WORD, sw.lwLONG_WORDS.usLOW_WORD);
Re: как моменять местами слова в unsigned long не используя
От: Аноним  
Дата: 12.11.03 08:31
Оценка:
Здравствуйте, alexora, Вы писали:

A>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>киньте код плиз, что бы он работал в gcc

    unsigned long x = ...
    x = ((x << 16) | (x >> 16)) & 0xffffffffUL;
Re: как моменять местами слова в unsigned long не используя
От: Vamp Россия  
Дата: 12.11.03 08:34
Оценка:
unsigned long lng=2290664516;
unsigned long lng2=lng;
size_t size=sizeof(unsigned long)*8;

lng2=((lng >> (size/2)) | (lng << (size/2)));
Да здравствует мыло душистое и веревка пушистая.
Re[2]: как моменять местами слова в unsigned long не использ
От: id  
Дата: 12.11.03 08:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, alexora, Вы писали:


A>>как моменять местами слова в unsigned long не используя макросы vc++6.0. (HWORD, LWORD)

A>>киньте код плиз, что бы он работал в gcc

А>
А>    unsigned long x = ...
А>    x = ((x << 16) | (x >> 16)) & 0xffffffffUL;
А>


    unsigned long x = ...
    x = ((x << (sizeof(x)<<4) ) | (x >> (sizeof(x)<<4))) & (unsigned long)(-1);
Re[3]: как моменять местами слова в unsigned long не использ
От: Аноним  
Дата: 12.11.03 09:12
Оценка:
Здравствуйте, id, Вы писали:

А>>    unsigned long x = ...
А>>    x = ((x << 16) | (x >> 16)) & 0xffffffffUL;

id>    unsigned long x = ...
id>    x = ((x << (sizeof(x)<<4) ) | (x >> (sizeof(x)<<4))) & (unsigned long)(-1);

Во-первых, как я понял, Вы пытались решить другую задачу. Во-вторых, при чем тут sizeof x? sizeof(unsigned long) не связан с количеством значащих двоичных разрядов в значениях этого типа. В-третьих, почему Вы решили, что приведение -1 к типу unsigned long должно давать максимальное беззнаковое значение?
Re[2]: как моменять местами слова в unsigned long не использ
От: Аноним  
Дата: 12.11.03 09:16
Оценка:
А>    unsigned long x = ...
А>    x = ((x << 16) | (x >> 16)) & 0xffffffffUL;


А зачем &0xffffffffUL ? Что-то с утра мозги туго ворочаются
Re[3]: как моменять местами слова в unsigned long не использ
От: Аноним  
Дата: 12.11.03 09:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>    unsigned long x = ...
А>>    x = ((x << 16) | (x >> 16)) & 0xffffffffUL;

А>А зачем &0xffffffffUL ? Что-то с утра мозги туго ворочаются

В расчете на то, что в unsigned long может быть больше 32-х значащих битов.

P.S. Да, этот код рассчитывает на то, что в младших 32-х битах x — значение, а старшие (если они есть) нулевые.
Re[4]: как моменять местами слова в unsigned long не использ
От: Аноним  
Дата: 12.11.03 09:35
Оценка:
OK
Re[3]: как моменять местами слова в unsigned long не использ
От: adontz Грузия http://adontz.wordpress.com/
Дата: 12.11.03 09:49
Оценка:
Здравствуйте, aik, Вы писали:

aik>ответ неверный. ему надо чтобы 0x12345678 стало 0x56781234, а не 0x78563412.


Прогоните эти функции и сами посмотрите что они делают
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: как моменять местами слова в unsigned long не использ
От: Павел Кузнецов  
Дата: 12.11.03 09:53
Оценка:
Здравствуйте, id, Вы писали:

i>
 i> typedef struct tagLONG_WORDS{
 i>   unsigned short usLOW_WORD;
 i>   unsigned short usHIGH_WORD;
 i> } LONG_WORDS;

 i> typedef union _SWAP_WORDS{
 i>  unsigned long ulLONG;
 i>  LONG_WORDS  lwLONG_WORDS;
 i> } SWAP_WORDS;

 i> SWAP_WORDS sw;
 i> sw.ulLONG = <value>;

 i> // TODO: method swap(unsigned short*, unsigned short*) ;-)
 i> swap(sw.lwLONG_WORDS.usHIGH_WORD, sw.lwLONG_WORDS.usLOW_WORD);
 i>


Прямой путь к неопределенному поведению. Не только запись в один член объединения,
а чтение из другого не гарантируется, но даже такая банальная вещь, как
выравнивание может внести свою лепту в уверенное "падение" данной программы.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: как моменять местами слова в unsigned long не использ
От: aik Австралия  
Дата: 12.11.03 11:43
Оценка:
Здравствуйте, adontz, Вы писали:

aik>>ответ неверный. ему надо чтобы 0x12345678 стало 0x56781234, а не 0x78563412.

A>Прогоните эти функции и сами посмотрите что они делают

я знаю что они делают.

#include <windows.h>
#include <stdio.h>
#include <winsock.h>

int main( int argc, char *argv[] )
{
    DWORD dw = 0x12345678;  
    DWORD dw1 = htonl( dw );
    DWORD dw2 = MAKELONG( HIWORD( dw ), LOWORD( dw ) );

    printf( "htonl( 0x%08X ) -> 0x%08X\r\n", dw, dw1 );
    printf( "MAKELONG( 0x%08X ) -> 0x%08X\r\n", dw, dw2 );

    return 0;
}


выведено прогой:
htonl( 0x12345678 ) -> 0x78563412
MAKELONG( 0x12345678 ) -> 0x56781234
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.