2012-11-04 40 views
5

Vì vậy, tôi có 3 số. Một là char và hai số còn lại là int16_t (còn được gọi là short s, nhưng theo bảng tôi thấy quần short không đáng tin cậy là 16 bit).Ghép số nhị phân có độ dài khác nhau

Tôi muốn ghép chúng lại với nhau. Vì vậy, nói rằng các giá trị của chúng là:

10010001

1111111111111101

1001011010110101

Tôi muốn kết thúc với một long long chứa:

1001000111111111111111011001011010110101000000000000000000000000

Sử dụng một số giải pháp tôi đã tìm thấy trực tuyến, tôi c ame up with this:

long long result; 
result = num1; 
result = (result << 8) | num2; 
result = (result << 24) | num3; 

Nhưng nó không hoạt động; nó mang lại cho tôi những con số rất kỳ lạ khi nó được giải mã.

Trong trường hợp có một vấn đề với mã giải mã của tôi, ở đây nó là:

char num1 = num & 0xff; 
int16_t num2 = num << 8 & 0xffff; 
int16_t num3 = num << 24 & 0xffff; 

gì đang xảy ra ở đây? Tôi nghi ngờ nó đã làm với kích thước của một long long, nhưng tôi không thể hoàn toàn quấn quanh đầu của tôi và tôi muốn phòng cho số lượng nhiều hơn trong nó sau này.

Trả lời

6

Để có được chút-pattern đúng như bạn yêu cầu, bạn shoud sử dụng:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 
result<<=24; 

này sẽ mang lại các mô hình chính xác chút mà bạn yêu cầu, 24 bit tại LSB-end trái 0:

1001000111111111111111011001011010110101000000000000000000000000 
3

Để thay đổi cuối cùng, bạn chỉ nên dịch chuyển 16, không bằng 24. 24 là độ dài hiện tại của chuỗi nhị phân, sau khi kết hợp num1 và num2. Bạn cần phải nhường chỗ cho num3, đó là 16 bit, vì vậy chuyển trái bằng 16.

Edit:

Chỉ cần nhận ra sự thay đổi đầu tiên là sai quá. Đó cũng là 16, vì những lý do tương tự.

1

Có bạn đang tràn giá trị có thể được lưu trữ trong thời gian dài. Bạn có thể sử dụng thư viện precison tùy ý để lưu trữ số lớn như GMP.

+0

Tôi sẽ xem xét điều đó, nhưng tôi có thể nghĩ về một cách tiếp cận khác (đặt các số ở bên phải thay vì bên trái?) Vì các số đơn giản là nhanh nhất. – Cheezey

+0

Anh ấy đang sử dụng 'long long', không phải' long'. 'long long' có thể lưu trữ ít nhất 64 bit, anh ta chỉ cần 40. –

0

Nếu tôi hiểu đúng những gì bạn đang làm, tôi sẽ sử dụng:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 

num1out = (result >> 32) & 0xff; 
num2out = (result >> 16) & 0xffff; 
num3out = result & 0xffff; 

Các dịch trái trong tòa nhà là bởi độ rộng của số bên cạnh chèn. Sự dịch chuyển đúng về khai thác là bởi tổng số bit mà trường đã được dịch chuyển trong khi xây dựng.

Tôi đã thử nghiệm mã trên. lâu dài là đủ rộng cho nhiệm vụ này với trình biên dịch g ++, và tôi tin nhiều người khác.

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