Mục đích của việc sử dụng toán tử Shift thay vì sử dụng phép chia và phép nhân là gì?Tại sao chúng ta cần sử dụng toán tử shift trong java?
Có lợi ích nào khác của việc sử dụng toán tử dịch chuyển không?
Bạn nên cố gắng sử dụng toán tử shift ở đâu?
Trả lời
Chia và nhân không được thực sự sử dụng toán tử dịch chuyển bit. Chúng là một 'tối ưu hóa' đã lỗi thời, một số thích áp dụng.
Chúng là các thao tác bit và hoàn toàn cần thiết khi làm việc ở cấp bit trong một giá trị số nguyên.
Ví dụ: giả sử tôi có hai byte là byte thứ tự cao và thứ tự thấp của giá trị không dấu hai byte (16 bit). Giả sử bạn cần xây dựng giá trị đó. Trong Java, đó là:
int high = ...;
int low = ...;
int twoByteValue = (high << 8) | low;
Bạn không thể làm điều này nếu không có nhà điều hành dịch chuyển.
Để trả lời câu hỏi của bạn: bạn sử dụng chúng ở nơi bạn cần sử dụng chúng! và không nơi nào khác.
Toán tử shift được sử dụng khi bạn đang thực hiện hợp lý bit hoạt động, thay vì hoạt động toán học.
Nó có thể được sử dụng cho tốc độ, nhanh hơn đáng kể so với phép chia/phép nhân khi giao dịch với toán hạng là hai, nhưng độ rõ của mã thường được ưu tiên hơn tốc độ thô.
Nó cũng có thể được sử dụng trong mã hóa/giải mã .. Ví dụ: http://freedom2blog.com/2010/05/easy-encryption-using-bitwise-exclusive-or-xor/
Liên kết không hoạt động. Nhưng tôi tìm thấy một trang khác giải thích cùng một khái niệm. http://crypto.stackexchange.com/questions/19470/how-is-xor-used-for-encryption – shreeneewas
Nó rất hữu ích trong việc xây dựng giá trị mà là một sự kết hợp các con số, nơi bit được nhóm lại như các giá trị khác nhau mình. (Câu trả lời Sean Owen giải thích điều này tốt hơn.)
Ví dụ, làm việc với màu sắc đó là:
"#AARRGGBB"
như là một chuỗi base160xAAAARRRRGGGGBBBB
là một số nguyên
Trong định dạng số nguyên của nó , bạn có thể sử dụng shift để lấy giá trị thực của một thành phần của số nguyên như một số có thể sử dụng được.
public static int stringToColor(String s) throws JSExn {
// string starts with '#' - parse integer from string
try {
// used to build up the return value
int a, r, g, b;
switch (s.length()) {
case 4:
a = 0xFF000000;
r = Integer.parseInt(s.substring(1, 2), 16);
r = r << 16 | r << 20;
b = Integer.parseInt(s.substring(2, 3), 16);
b = b << 8 | b << 12;
g = Integer.parseInt(s.substring(3, 4), 16);
g = g | g << 4;
break;
case 5:
a = Integer.parseInt(s.substring(1, 2), 16);
a = a << 24 | a << 28;
r = Integer.parseInt(s.substring(2, 3), 16);
r = r << 16 | r << 20;
b = Integer.parseInt(s.substring(3, 4), 16);
b = b << 8 | b << 12;
g = Integer.parseInt(s.substring(4, 5), 16);
g = g | g << 4;
break;
case 7:
a = 0xFF000000;
r = Integer.parseInt(s.substring(1, 3), 16) << 16;
b = Integer.parseInt(s.substring(3, 5), 16) << 8;
g = Integer.parseInt(s.substring(5, 7), 16);
break;
case 9:
a = Integer.parseInt(s.substring(1, 3), 16) << 24;
r = Integer.parseInt(s.substring(3, 5), 16) << 16;
b = Integer.parseInt(s.substring(5, 7), 16) << 8;
g = Integer.parseInt(s.substring(7, 9), 16);
break;
default:
throw new JSExn("Not a valid color: '"+s+"'");
}
// return our integer ARGB
return a | r | b | g;
}
Giảm cường độ xảy ra khi thao tác được thay thế bằng thao tác tương đương thực thi nhanh hơn.
- thay thế phân chia số nguyên hoặc nhân bởi một sức mạnh của 2 với một sự thay đổi số học hoặc thay đổi logic ..
- thay thế nguyên nhân với một hằng số với sự kết hợp của sự thay đổi, thêm hoặc trừ.
- thay thế phân chia số nguyên theo hằng số bằng phép nhân, tận dụng dải giới hạn số nguyên máy hạn chế.
Tại sao điều này sai?
1. Giảm hiệu suất theo thời gian cần thiết để tăng tính toán. 2. Phép tính số học như phép chia và phép nhân chậm hơn. 3. hoạt động Đắt
Lợi ích
- Cải thiện hiệu suất.
- Tính toán nhanh hơn.
Demerit
- Độ khó của Bộ luật giảm.
Nó rất hữu ích khi bạn đối phó với lá cờ, bạn có thể lưu trữ chỉ trong một int
biến các thông tin về cờ hoạt động, xem sau xin vui lòng:
public class DealingWithShiftOperators {
public static void main(String[] args) {
int active_flags = 10;
printActiveFlags(active_flags);
}
public static void printActiveFlags(int active_flags) {
final int TOTAL_FLAGS = 8;
final int MAX_VALUE = 1 << TOTAL_FLAGS;
final int MIN_VALUE = 1;
int current_flag = MAX_VALUE;
do {
current_flag = current_flag >> 1;
if (active_flags - current_flag < 0) {
System.out.println(current_flag + ": off");
} else {
active_flags = active_flags - current_flag;
System.out.println(current_flag + ": on");
}
} while (current_flag > MIN_VALUE);
}
}
Ví dụ trên sẽ in tiếp theo để đầu ra:
128: off
64: off
32: off
16: off
8: on
4: off
2: on
1: off
Như bạn có thể thấy, active_flags
là số 2 và số 8. Chúng tôi lưu trữ thông tin mà chỉ trong vòng một biến, giá trị của nó là 10 (8 + 2).
- 1. Tại sao chúng ta cần toán tử === đặc biệt này?
- 2. Tại sao chúng ta cần toán tử "delete []"?
- 3. tại sao chúng ta thích? đến ?? toán tử trong C#?
- 4. Tại sao chúng ta cần giao diện trong Java?
- 5. Tại sao chúng ta cần sử dụng cơ số?
- 6. Tại sao có hai toán tử Shift phải và chỉ có một toán tử Shift trái đơn trong Java?
- 7. Tại sao chúng ta cần sử dụng trình lặp trên ArrayList trong Java?
- 8. Tại sao chúng ta cần strdup()?
- 9. Tại sao chúng ta cần ng-click?
- 10. Tại sao chúng ta không sử dụng toán tử mới khi khởi tạo một chuỗi?
- 11. Tại sao chúng ta sử dụng Response.ClearHeaders()?
- 12. PHP: Tại sao chúng ta cần hàm so sánh chuỗi?
- 13. Tại sao chúng ta cần sợi
- 14. Tại sao chúng ta cần funcall trong Lisp?
- 15. Tại sao chúng ta cần một thẻ fieldset?
- 16. Tại sao chúng ta sử dụng radian trong lập trình?
- 17. Tại sao chúng ta cần Properties trong C#
- 18. Tại sao chúng ta đang sử dụng nguyên tử trong phần còn lại?
- 19. tại sao chúng ta không nên sử dụng ++ trong javascript?
- 20. MVC: tại sao chúng ta cần "điều khiển", hoặc khi nào chúng ta nên sử dụng mẫu này?
- 21. Tại sao chúng ta sử dụng động Proxy
- 22. Tại sao chúng ta cần các Dịch vụ Web RESTful?
- 23. flexbox vs bảng, tại sao chúng ta cần flexbox?
- 24. lý do tại sao chúng ta cần Hadoop cho hypertable
- 25. tại sao chúng ta cần tính toán thời gian từ năm 1970?
- 26. Tại sao chúng ta cần các nhà thầu tĩnh?
- 27. Tại sao chúng ta cần ssh không mật khẩu Hadoop?
- 28. Tại sao chúng ta nên sử dụng mã hóa ui khi chúng ta có Specflow?
- 29. Tại sao chúng ta sử dụng giao diện thành viên?
- 30. Tại sao chúng ta cần phương pháp ContinueWith?
tôi nghe nói, nó làm cho phép chia/nhân số nguyên nhanh hơn *,/ – Saravanan
Chuyển sang trái bằng 1 nhanh hơn nhân 2. Nhưng, trình biên dịch JIT và bộ xử lý của bạn biết điều này tốt hơn bạn, và nên làm điều đó tự động. Trong mọi trường hợp, đây không phải là việc sử dụng ca * chính *; nó được cho là thậm chí không sử dụng tốt. –
không có trong java. Ngay cả trong C những ngày này. Các trình biên dịch đủ thông minh để tối ưu hóa mã của bạn. Tốt nhất là đảm bảo mã của bạn có thể đọc được và thể hiện những gì nó muốn làm thay vì cố gắng outsmart trình biên dịch và làm cho nó không thể đọc được. –