2009-02-25 33 views
9
typedef unsigned char Byte; 

... 

void ReverseBytes(void *start, int size) 
{ 
    Byte *buffer = (Byte *)(start); 

    for(int i = 0; i < size/2; i++) { 
     std::swap(buffer[i], buffer[size - i - 1]); 
    } 
} 

Phương pháp này hiện tại là nó đảo ngược byte trong bộ nhớ. Những gì tôi muốn biết là, có cách nào tốt hơn để có được hiệu quả tương tự không? Toàn bộ "kích thước/2" phần có vẻ như một điều xấu, nhưng tôi không chắc chắn.Có cách nào tốt hơn để đảo ngược một mảng byte trong bộ nhớ không?

EDIT: Tôi vừa nhận ra rằng tiêu đề tôi đặt cho câu hỏi này là xấu đến mức nào, vì vậy tôi [hy vọng] đã sửa nó.

+0

Ví dụ của bạn có vẻ không hoàn thiện, làm cách nào bạn có thể trao đổi hai ký tự không có vị trí? Tôi nghi ngờ bạn cần vượt qua địa chỉ. – leppie

Trả lời

23

Các thư viện chuẩn có chức năng std::reverse:

#include <algorithm> 
void ReverseBytes(void *start, int size) 
{ 
    char *istart = start, *iend = istart + size; 
    std::reverse(istart, iend); 
} 
+0

Cảm ơn. Tôi nên xem xét nó trước khi tự viết nó. – xian

+0

Mô tả về chức năng đảo ngược nói rằng nó được thực hiện chính xác theo cách người hỏi câu hỏi đã thực hiện nó và nó có cùng độ phức tạp. Nó không thực sự là một cách tốt hơn. Một cách rõ ràng hơn có thể là tốt nhất .. – Julius

1

Nếu bạn cần phải đảo ngược có một cơ hội mà bạn có thể cải thiện các thuật toán của bạn và chỉ cần sử dụng vòng lặp ngược lại.

+0

Đó là để đọc dữ liệu từ các tệp sử dụng các endianness khác nhau. – xian

+0

@kitchen, điều này có vẻ giống như đảo ngược byte của số nguyên, không phải byte của toàn bộ mảng ... –

1

Nếu bạn đang đảo ngược dữ liệu nhị phân từ tệp có độ cuối khác nhau, bạn có thể sử dụng các hàm ntoh * và hton *, chuyển đổi các kích thước dữ liệu được chỉ định từ mạng sang thứ tự lưu trữ và ngược lại. ntohl ví dụ chuyển đổi một bit dài 32 bit unsigned từ lớn endian (thứ tự mạng) để lưu trữ thứ tự (ít endian trên x86 máy).

+0

Câu hỏi này liên quan đến việc hoán đổi một mảng, vì vậy các giải pháp được cung cấp ở trên câu trả lời cụ thể hơn nhu cầu. – Xofo

0

Tôi sẽ xem xét stl :: swap và đảm bảo rằng nó được tối ưu hóa; sau đó tôi muốn nói rằng bạn khá tối ưu cho không gian. Tôi chắc chắn rằng đó là thời gian tối ưu là tốt.

+0

Hư không gần thời gian tối ưu. Việc tính toán 'size/2' * có thể * được tối ưu hóa trong việc chạy mọi vòng lặp, nhưng phép tính' size-i-1' sẽ không, cũng như chi phí của việc lập chỉ mục mảng. Điều đó nói rằng, một vòng lặp hoàn hảo được tối ưu hóa sẽ không * nhanh hơn nhiều so với những gì anh ta có. –

+0

Đó là "không * đó * nhanh hơn nhiều" khiến tôi phải nói ... –

17

Một giải pháp performant mà không sử dụng STL:

void reverseBytes(void *start, int size) { 
    unsigned char *lo = start; 
    unsigned char *hi = start + size - 1; 
    unsigned char swap; 
    while (lo < hi) { 
     swap = *lo; 
     *lo++ = *hi; 
     *hi-- = swap; 
    } 
} 

Mặc dù câu hỏi là 3 tuổi rưỡi, rất có thể là một người nào khác sẽ được tìm kiếm điều tương tự. Đó là lý do tại sao tôi vẫn đăng bài này.

+5

Cơ hội đã nhận ra :) –

Các vấn đề liên quan