Chuyển tất cả các ký tự có trong một string (C++) thành dạng binary (1 char = 8 bit) NHANH NHẤT có thể?

Xin chào các thành viên diễn đàn DAYNHAUHOC!

Các bạn có cách nào để chuyển đổi tất cả các ký tự có trong một string về thành dạng binary 8 bit (một ký tự là 8bit) nhanh nhất không ? Ngoài cách dùng vòng lặp ra ấy ?

Dưới đây là cách mình dùng vòng lặp để chuyển đổi !
void main()
{
std::string str ="abcd",out;

for(int i=0;i<str.size();i++){
    std::bitset<8>binary(str[i]);//chuyển 1 ký tự thành 8 bít.
    out+=binary.to_string();//lưu vào output.
}
std::cout<<out<<std::endl;
}

Thật ra nếu xử lý dữ liệu nhỏ vd:str.size()=4 thì dùng cách trên cũng đươc , nhưng do dữ liệu mình xử lý là dữ liệu lớn vd:str.size()=4396680 dùng cách trên chậm quá ! Các bạn có cách nào hay chỉ mình với ?

1 Like

Chậm là do out phải copy dữ liệu khi thay đổi capacity - tối ưu hơn: resize out kích thước vừa đủ chứa
Dùng qua dữ liệu trung gian - tối ưu: lấy trực tiếp

Muốn nhanh tự code và dùng char* thay string

Tự code là sao bạn ? char * và string nó cũng như nhau thôi mà ! T đã áp dụng multi-thread vào cho nó xử lý rồi thời gian giảm đc phân nữa ! Nhưng t ý t muốn tham khảo các bạn có cách nào khác mà hay hơn t viết không ! Mấy bạn trả lời chung chung quá … có thể cụ thể hóa bằng 1 vài đoạn mã giả hay gì đó không ?

xài stringstream. Đừng xài out += ...

std::string str ="abcd";
std::ostringstream oss;

for(int i=0;i<str.size();i++){
    std::bitset<8>binary(str[i]);//chuyển 1 ký tự thành 8 bít.
    oss << binary.to_string();//lưu vào output.
}
std::cout << oss.str() << std::endl;

đừng bao giời nói string với char* như nhau nhá, 1 trời 1 vực đấy, tự code là code không dùng mấy hàm có sẵn

Cảm ơn bạn tntxtnt Trần Ngọc Trí :wink:… nhờ có bạn gợi ý mà mình tìm được cách mới hay hơn :sunglasses:nhờ xài stringstream sẳn chia sẽ với các bạn !

void main(){
        typedef std::bitset<CHAR_BIT> byte_type;

	std::ostringstream stream;
	std::string fred("hellossdadadadadadadassdadas");

	std::copy(fred.begin(),
		fred.end(),
		std::ostream_iterator<byte_type>(stream, " "));

	std::cout << stream.str() << std::endl;
}

@JuniorK Nguyên project của t code chai nó đã quá dài ! Nếu tự viết thêm không sử dụng hàm hổ trợ của thư viện std::string chắc t chết luôn quán :slight_smile: T biết khi tôi nói thế nào cũng bị bắt bẽ :smile: mà thôi dù gì t cũng là người code không chuyên nghiệp ! Cảm ơn bạn góp ý !

3 Likes

code của bạn là 4 dòng dùng char[] và tự code không quá 10 dòng đâu nhanh thì gấp nhiều lần đấy

Sao bạn không dùng phương thức c_str() để chuyển sang mảng ký tự rồi dùng memcpy copy nó sang mảng char nào đó

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?