cuốn sách gpt4 ai đã làm

c - thao tác bit phỏng vấn

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 05:38:40 31 4
mua khóa gpt4 Nike

Tôi được yêu cầu thực hiện đảo ngược(x,p,n) Trả về n bit của x bắt đầu từ vị trí p bị đảo ngược (nghĩa là 1 trở thành 0 và ngược lại), nếu không thì không thay đổi.

Giải pháp của tôi là:

đảo ngược không dấu(không dấu x, int p, int n)
{
return (x ^ (((1 << (n + 1)) - 1) << (p - n + 1)));
}

Tôi tìm thấy giải pháp cho vấn đề này trực tuyến:

đảo ngược không dấu(không dấu x, int p, int n)
{
return x ^ ((~(~0<
}

Đối với tôi nó có vẻ không ổn - cách giải quyết vấn đề chính xác và hiệu quả là gì

câu trả lời hay nhất

Chà, hãy cân nhắc việc triển khai của bạn rõ ràng là không chính xác; p = 1, n = 2:

x ^ (((1 << (n + 1)) - 1) << (p - n + 1))
x ^ (((1 << 3) - 1) << 0)
x ^ ((8 - 1) << 0)
x^7

Điều này đảo ngược ba bit thấp hơn của x thay vì hai. Chúng ta có thể giải quyết vấn đề này bằng cách sử dụng các phương pháp sau:

trả về x ^ (1 << n) - 1 << p - n + 1;

(Tôi cũng đã xóa rất nhiều dấu ngoặc đơn sai). Điều này vẫn có lỗi trường hợp góc; nếu người gọi muốn lật tất cả trừ một bit (tức là n == kích thước x * CHAR_BIT - 1). Giả sử int là 32 bit và đưa ra ví dụ:

x ^ (1 << n) - 1 << p - n + 1;
x ^ (1 << 31) - 1 << p - 31 + 1;
^^ ^^^ ^^ ^^
ồ-roh!

Thật không may, điều này dẫn đến hành vi không xác định (C11, §6.5.7 đoạn 4):

Nếu E1 có loại có dấu và giá trị không âm và E1 × 2E2 được thể hiện trong loại kết quả thì đó là giá trị kết quả; nếu không thì hành vi đó không được xác định.

Bạn có thể làm điều này bằng cách tạo hằng số 1 Không có biểu tượng nào để sửacái này ...

trả về x ^ (1U << n) - 1 << p - n + 1;

...nhưng khi nào n == kích thước x * CHAR_BIT khi bạn仍然có hành vi không xác định (tức là nếu người gọi muốn lậttất cả bit) (C11, §6.5.7 đoạn 3):

Nếu giá trị của toán hạng bên phải ... lớn hơn hoặc bằng độ rộng của toán hạng bên trái được thăng hạng thì hành vi đó không được xác định.

Các giải pháp bạn tìm thấy trực tuyến cũng có hành vi không xác định theo cách tương tự. Nếu bạn thực sự muốn tất cả các trường hợp đặc biệt chính xác quá mức về mặt mô phạm, bạn cần phải làm điều gì đó theo những dòng sau:

đảo ngược không dấu(không dấu x, int p, int n) {
if (p < 0 || p >= sizeof x * CHAR_BIT) {
/* lao ra giết người */
}
nếu (n < 0 || n > p + 1) {
/* (╯°□°)╯︵ ┻━┻) */
}
if (n == sizeof x * CHAR_BIT) return ~x;
/* Đã xử lý xong tất cả các trường hợp không xác định,
chúng tôi có thể sử dụng biểu cảm tử tế của bạn một cách an toàn.
Nhưng không có tất cả các dấu ngoặc đơn.
dấu ngoặc đơn khiến hulk tức giận */
trả về x ^ (1U << n) - 1 << p - n + 1;
}

Đây có phải là mô phạm và quá mức cần thiết? Đúng. Tôi có mong đợi ai đó viết điều này như một bước vượt qua đầu tiên trong một tình huống phỏng vấn không? Không, tôi hy vọng họ có một cuộc thảo luận thông minh về những mối nguy hiểm ở đây? Đúng.

Về hoạt động c - phỏng vấn - bit, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/19842966/

31 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress