2013-03-26 32 views
5

Tôi có một tệp nhị phân sẽ được đọc dưới dạng ký tự. Mỗi nhân vật được bit chuyển sang số lần không xác định bên trái (giả định với bọc) bởi người khác. Tôi muốn để có thể đọc trong mỗi nhân vật và sau đó quấn sang phải (số lần thay đổi tôi đoán sẽ phải được tìm ra bằng tay, bởi vì tôi đã không tìm ra một cách khác).Bit chuyển một nhân vật bằng cách quấn? C++

Vì vậy, ý tưởng hiện tại của tôi là tôi đọc trong một nhân vật, tạo ra một bản sao với temp và sau đó sử dụng XOR:

char letter; //will hold the read in letter 
char temp;  //will hold a copy of the letter 
while(file.read(&letter, sizeof(letter)) //letter now holds 00001101 
{ 
    temp = letter; //temp now holds 00001101 
    letter >>= 1; //shift 1 position to the right, letter now holds 00000110 
    temp <<= 7;  //shift to the left by (8-1), which is 7, temp now holds 10000000 
    letter ^= temp; //use XOR to get the wrap, letter now holds 10000110 
    cout << letter; 
} 

Điều đó làm cho cảm giác trong đầu kiệt sức của tôi, nhưng nó không hoạt động .. và tôi không thể hiểu tại sao. Kích thước của char là 1 byte, vì vậy tôi figured tôi chỉ có để mess xung quanh với 8 bit.

Mọi trợ giúp sẽ được đánh giá cao.

CHỈNH SỬA: Đã giải quyết. Cảm ơn rất nhiều đến tất cả mọi người. Yêu cộng đồng này đến chết, các bạn thật tuyệt vời!

+0

Bạn' đã nói với chúng tôi những gì bạn mong đợi - những gì bạn thực sự nhận được? –

+0

@sftrabbit Một số mớ hỗn độn khó hiểu. –

+0

Bạn đang đọc đến 'letter' hai lần trên mỗi vòng lặp, loại bỏ giá trị đọc đầu tiên – jthill

Trả lời

10

Chú ý đến chữ ký của char. Trên nhiều hệ thống, nó được ký. Vì vậy, letter >>= 1 của bạn là dấu hiệu làm đầy ca làm việc.

số nguyên Rotating thường được thực hiện như sau

letter = ((unsigned char)letter >> 1) | (letter << 7); 

Như Mark chỉ ra trong các ý kiến, bạn có thể sử dụng một trong hai HOẶC | hoặc XOR ^.

+1

BOOM! Điều đó làm việc bạn của tôi! Cảm ơn bạn rất nhiều. Tôi không sử dụng mã đã chỉnh sửa, nhưng tôi sẽ thử. Những gì tôi đã làm được đọc trong một dàn diễn viên của char để một unsigned char và nó làm việc như một say mê. Cảm ơn rất nhiều vì đã chỉ ra điều không dấu ... không thể tin rằng tôi đã bỏ lỡ nó. –

+0

Nếu không có các bit trùng lặp, 'hoặc' và' xor' sẽ tạo ra kết quả tương tự. –

+0

@MarkRansom Bạn chính xác. Điều đó thậm chí không vượt qua tâm trí của tôi. – Kyurem

0

Tuyên bố temp <<= 7 đang mất các bit mà bạn muốn gói. Bạn sẽ cần phải dịch chuyển sang trái một bit tại một thời điểm. Đầu tiên kiểm tra bit char quan trọng nhất và nếu thiết lập di chuyển nó đến đúng bit nhất trước khi thực hiện ca làm việc.

+0

temp được dịch chuyển 7 sang trái vì chữ được dịch sang phải một lần. Khi tôi sử dụng XOR trên cả hai, nó mang lại cho tôi một chút đã bị rơi ở phía bên phải (và bây giờ nó nằm ở bên trái, quấn quanh). –

0

Tôi muốn được xu hướng sử dụng một loại không thể thiếu lớn hơn:.

unsigned val = (unsigned)letter & 0xFF; 
val |= val << 8; 

Bây giờ bạn chỉ phải chuyển giá trị trong val, mà không cần bất kỳ mã bổ sung để bọc các bit cao trở lại trong

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