2011-09-17 53 views

Trả lời

13

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.

+0

tôi nghe nói, nó làm cho phép chia/nhân số nguyên nhanh hơn *,/ – Saravanan

+2

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. –

+6

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. –

6

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.

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ô.

1

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 base16
  • 0xAAAARRRRGGGGBBBB 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; 
} 
0

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.

  1. 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 ..
  2. 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ừ.
  3. 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

  1. Cải thiện hiệu suất.
  2. Tính toán nhanh hơn.

Demerit

  1. Độ khó của Bộ luật giảm.
0

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).

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