Vấn đề: Bài tập 2-8 của Ngôn ngữ lập trình C, "Viết hàm đúng (x, n) trả về giá trị của số nguyên x, được xoay sang phải bởi n vị trí."Xoay bit trong C
Tôi đã làm điều này theo mọi cách mà tôi biết cách thực hiện. Đây là vấn đề tôi đang gặp phải. Lấy một số cho bài tập này, nói 29, và xoay nó đúng một vị trí.
11101 và nó trở thành 11110 hoặc 30. Giả sử vì lý do mà hệ thống chúng tôi đang làm việc có kích thước loại số nguyên không dấu là 32 bit. Hãy tiếp tục nói rằng chúng ta có số 29 được lưu trữ trong một biến số nguyên không dấu. Trong bộ nhớ số sẽ có 27 số không trước nó. Vì vậy, khi chúng tôi xoay 29 phải sử dụng một trong nhiều thuật toán của tôi được đăng dưới đây, chúng tôi nhận được số 2147483662. Điều này rõ ràng không phải là kết quả mong muốn.
unsigned int rightrot(unsigned x, int n) {
return (x >> n) | (x << (sizeof(x) * CHAR_BIT) - n);
}
Về mặt kỹ thuật, điều này là đúng, nhưng tôi đã nghĩ rằng 27 số không ở trước mặt 11101 không đáng kể. Tôi cũng đã thử một vài giải pháp khác:
int wordsize(void) { // compute the wordsize on a given machine...
unsigned x = ~0;
int b;
for(b = 0; x; b++)
x &= x-1;
return x;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
while(n --) {
rbit = x >> 1;
x |= (rbit << wordsize() - 1);
}
return x;
giải pháp cuối cùng và cuối cùng này là một trong những nơi mà tôi nghĩ rằng tôi đã có nó, tôi sẽ giải thích nơi nó đã thất bại một lần tôi nhận được đến cùng. Tôi chắc chắn rằng bạn sẽ thấy sai lầm của tôi ...
int bitcount(unsigned x) {
int b;
for(b = 0; x; b++)
x &= x-1;
return b;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
int shift = bitcount(x);
while(n--) {
rbit = x & 1;
x >>= 1;
x |= (rbit << shift);
}
}
Giải pháp này cung cấp câu trả lời mong đợi là 30 mà tôi đang tìm kiếm, nhưng nếu bạn sử dụng một số cho x như oh nói 31 (11111), thì có những vấn đề, đặc biệt là kết quả là 47, sử dụng một cho n. Tôi đã không nghĩ về điều này trước đó, nhưng nếu một số như 8 (1000) được sử dụng thì tình trạng lộn xộn. Chỉ có một bộ bit trong 8, do đó, sự thay đổi chắc chắn sẽ là sai. Lý thuyết của tôi vào thời điểm này là hai giải pháp đầu tiên là chính xác (chủ yếu) và tôi chỉ thiếu một cái gì đó ...
Tôi sẽ thực hiện điều đó để có nghĩa là hành vi của hai ví dụ đầu tiên là chính xác và tôi sẽ không phát điên. – Brandon
Tôi không chắc chắn về giả định của bạn rằng 2147483662 là câu trả lời sai. Có vẻ đúng với tôi! Câu hỏi có nghĩa là "số nguyên x", ngụ ý một số bit nhất định trong x, ví dụ: 32. Nếu không, nên rightrot (1,1) luôn luôn trở về 1? –
Ông Lister, tôi thừa nhận hoàn toàn. Có vẻ như một số quan niệm mà tôi có về binay, cách nó được lưu trữ, và cách mà nó được hiểu là sai. Tôi giả định rằng giá trị đã sai ở nơi đầu tiên, bởi vì tôi đã lấy 27 số không tiến hành giá trị mà tôi đang sử dụng trong bộ nhớ không đáng kể với giá trị đó. và tôi nhận được những gì bạn đang nói về một. Nếu rightrot (1,1) luôn trả về 1 thì làm thế nào người ta có thể xoay một con số như 1000 hay 10000000000000000000000000000000. – Brandon