Giả sử tôi có một byte như thế này 1010XXXX trong đó các giá trị X có thể là bất kỳ thứ gì. Tôi muốn thiết lập bốn bit thấp hơn cho một mẫu cụ thể, nói 1100, trong khi để lại bốn bit trên không bị ảnh hưởng. Làm thế nào tôi sẽ làm điều này nhanh nhất trong C?Làm thế nào để bạn chỉ thiết lập một số bit của một byte trong C mà không ảnh hưởng đến phần còn lại?
Trả lời
Bạn có thể đặt tất cả các bit đó thành 0 bằng bitwise-anding với 4 bit được đặt thành 0 và tất cả các thiết lập khác thành 1 (Đây là phần bù của 4 bit được đặt thành 1). Bạn có thể sau đó bitwise hoặc trong các bit như bình thường.
tức
val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
// other bits are set.
Nói chung:
value = (value & ~mask) | (newvalue & mask);
mask
là một giá trị với tất cả các bit được thay đổi (và chỉ cho họ) để thiết lập 1 - nó sẽ được 0xF trong trường hợp của bạn. newvalue
là một giá trị chứa trạng thái mới của các bit đó - tất cả các bit khác về cơ bản đều bị bỏ qua.
Điều này sẽ hoạt động với tất cả các loại mà nhà khai thác bitwise được hỗ trợ.
Sử dụng toán tử bitwise hoặc | khi bạn muốn thay đổi các bit của một byte từ 0 đến 1.
điều hành Sử dụng Bitwise và & khi bạn muốn thay đổi các bit của một byte 1-0
Ví dụ
#include <stdio.h>
int byte;
int chb;
int main() {
// Change bit 2 of byte from 0 to 1
byte = 0b10101010;
chb = 0b00000100; //0 to 1 changer byte
printf("%d\n",byte); // display current status of byte
byte = byte | chb; // perform 0 to 1 single bit changing operation
printf("%d\n",byte);
// Change bit 2 of byte back from 1 to 0
chb = 0b11111011; //1 to 0 changer byte
byte = byte & chb; // perform 1 to 0 single bit changing operation
printf("%d\n",byte);
}
Có lẽ có những cách tốt hơn, tôi không biết. Điều này sẽ giúp bạn ngay bây giờ.
- 1. Làm thế nào để bạn thiết lập chỉ độ rộng hình ảnh của một thumbnail Wordpress
- 2. Sơn trong một phần của JPanel mà không cần sơn lại phần còn lại
- 3. Làm thế nào để tìm phần còn lại của một bộ phận trong C?
- 4. Lập trình chức năng ảnh hưởng đến kiểu mã hóa của bạn như thế nào?
- 5. Làm thế nào để bạn làm modulo hoặc phần còn lại trong Erlang?
- 6. Nhận phần còn lại của chuỗi đến cuối với mb_substr() và vẫn thiết lập mã hóa
- 7. Làm thế nào để đảo ngược bit của một byte?
- 8. Ảnh hưởng của chỉ số z của một phần tử trên chỉ mục z của: trước /: sau phần tử giả
- 9. Làm thế nào để một luồng.Thread mang lại phần còn lại của lượng tử trong Python?
- 10. Làm thế nào để sử dụng TRUNCATE TABLE ảnh hưởng đến chỉ số
- 11. Làm thế nào để bạn tắt một bit cụ thể trong một mặt nạ bit?
- 12. Float một quyền div, mà không ảnh hưởng đến thiết kế
- 13. Làm thế nào để tìm phần còn lại của một bộ phận trong Ruby?
- 14. Làm thế nào để bạn giả lập một số IE2umerIEnumerable?
- 15. Làm thế nào để bạn đọc một mảng byte từ một DataRow trong C#?
- 16. bitmask: làm thế nào để xác định nếu chỉ có một bit được thiết lập
- 17. Làm thế nào để giả lập một phương thức trả về khoảng trống ảnh hưởng đến một đối tượng
- 18. Tại sao loại trường bit ảnh hưởng đến kích thước của cấu trúc chứa?
- 19. Làm thế nào để chuyển đổi một byte thành bit?
- 20. Vượt qua một đối số bằng cách tham chiếu trong C++/CLI để gán lại ảnh hưởng đến người gọi
- 21. Làm thế nào để thay đổi một tấm đệm DIV mà không ảnh hưởng đến chiều rộng/chiều cao?
- 22. Có cách nào để di chuột qua một phần tử và ảnh hưởng đến một phần tử khác không?
- 23. Làm thế nào để đúc một số vào một byte?
- 24. Làm thế nào để thiết lập lại keystores khi bạn không biết mật khẩu của họ?
- 25. thay thế byte trong 32 bit số
- 26. Làm thế nào bạn có thể biết liệu một stit git không còn cần thiết?
- 27. Làm cách nào để 'hợp nhất hg' mà không ảnh hưởng đến thư mục làm việc?
- 28. Làm thế nào để bạn cho phép PHP ghi vào một tệp mà không ảnh hưởng đến bảo mật máy chủ
- 29. Làm thế nào để bạn chuyển đổi một mảng byte thành một thể hiện Bitmap (.NET)?
- 30. Làm thế nào để bạn đọc trong một giá trị kích thước 3 byte như một số nguyên trong c + +?
Bạn có thể đưa ra một ví dụ cụ thể không? Giả sử tôi có: n = 1024. Tôi muốn thay đổi bit từ vị trí 3 đến 7 (bao gồm, bắt đầu từ 0 với bit ít quan trọng nhất) thành k = 19. Kết quả phải là: 1176. Làm thế nào tôi có thể đạt được nó? Cảm ơn bạn. – dh16