2008-11-04 28 views
36

Mặc dù tôi nắm bắt được khái niệm về Bitwise Operators, tôi không thể nói rằng tôi đã gặp phải nhiều trường hợp sử dụng trong quá trình phát triển web mà tôi phải sử dụng để sử dụng Bitwise Operators.Khi nào thì nên sử dụng Bitwise Operators trong quá trình phát triển web?

  • Bạn có sử dụng Bitwise Operators không?
  • Tại sao bạn sử dụng chúng?
  • Một số trường hợp sử dụng mẫu là gì?

Hãy nhớ rằng câu hỏi này dành riêng cho việc sử dụng Bitwise Operators trong ngôn ngữ web.

+0

Không có gì cụ thể về việc sử dụng toán tử bitwise trong "ngôn ngữ web". Nó là vô nghĩa như yêu cầu * khi nào bạn sẽ sử dụng một bộ lọc mờ xuyên tâm trong thiết kế web? *. Bản sao của http://stackoverflow.com/questions/276706/what-are-bitwise-operators, http://stackoverflow.com/questions/1746613/bitwise-operation-and-usage, http://stackoverflow.com/ câu hỏi/1167956/tài nguyên để học-bitwise-lập trình và những người khác. –

Trả lời

47

Việc sử dụng chính của tôi đối với các toán tử bitwise có thể có liên quan ở bất kỳ đâu - đại diện cho một tập hợp các cờ. Ví dụ, bạn có thể có một số nguyên trong cơ sở dữ liệu đại diện cho một tập hợp các quyền bảo mật cho một người dùng, và trong ứng dụng web của bạn, bạn sẽ phải kiểm tra chúng trước khi tiếp tục.

Những người có xu hướng chỉ yêu cầu &| - ví dụ:

if ((permissions & Permission.CreateUser) != 0) 
{ 
    ... 
} 

hoặc

Permission requiredPermission = Permission.CreateUser 
           | Permission.ChangePassword; 

Bit chuyển nhà khai thác được ít hữu ích trong việc "kinh doanh" các ứng dụng trong kinh nghiệm của tôi.

+16

Downvoters: Hãy giải thích các downvotes của bạn, hoặc họ là vô nghĩa. –

+2

+1, nhưng hoạt động chuyển dịch không phải là vô ích khi nói đến mật mã. Ví dụ, algorythm MD5 sử dụng dịch chuyển bit. Nó có thể là một ví dụ xấu bởi vì MD5 đã được thực hiện trong PHP, nhưng đó là điều đầu tiên đến với tâm trí của tôi. – Hnatt

+5

@ Hatt: Chính xác - nó hầu như không * business * logic, trừ khi doanh nghiệp của bạn cung cấp các chức năng mã hóa. –

1

Tôi thường xuyên sử dụng chúng nhưng không bao giờ ở những nơi tôi có thể tránh chúng. Thường xuyên nhất tôi đã sử dụng chúng là hai tình huống sau đây.

  1. Mã hóa dữ liệu biểu mẫu từ ứng dụng khách bằng JavaScript khi không kết nối an toàn, không nhiều nhưng tốt hơn gửi văn bản thuần túy.
  2. Cấu trúc tệp truyền trực tuyến (thường là một số loại tệp nhị phân) từ PHP được tạo khi đang di chuyển.
+1

Một số ví dụ sẽ tốt đẹp. –

2

Nói chung, bạn không cần phải quan tâm đến hoạt động ở cấp bit. Bạn có thể nghĩ theo byte, int, tăng gấp đôi và các loại dữ liệu cấp cao hơn khác. Nhưng có những lúc bạn muốn để có thể đi đến mức độ của một chút cá nhân.

Một trong những trường hợp sử dụng phổ biến nhất của các toán tử bitwise là flags (ví dụ về php). bitwise operators cũng được sử dụng trong các hoạt động IO của tệp nhị phân.

1

Ở bên ngoài chủ đề, trong ngôn ngữ cấp cao, đặc biệt là trong các ngôn ngữ được phân tích cú pháp (chẳng hạn như PHP), các hoạt động bit là chậm hơn [cần dẫn nguồn] so với số học bình thường. Vì vậy, trong khi kiểm tra sự cho phép của Jon có thể được chấp nhận từ quan điểm hiệu suất, nó không phải là rất 'bản địa' trong miền web.

6

Ngoài cờ, không có nhiều lý do để sử dụng thao tác bit trong các ngôn ngữ kịch bản. Nhưng một khi bạn đi sâu vào các cấp thấp hơn của ngăn xếp của bạn, hoạt động bit trở nên ngày càng quan trọng.

77

Tôi sẽ rõ ràng hơn ở đây vì tôi nghĩ mặt nạ bitwise là một công cụ tuyệt vời nên nằm trong bất kỳ vành đai nhà phát triển nào. Tôi sẽ cố gắng mở rộng các câu trả lời ở trên.Thứ nhất, một ví dụ của việc sử dụng một số nguyên để duy trì cờ trạng thái (sử dụng phổ biến):

// These are my masks 
private static final int MASK_DID_HOMEWORK = 0x0001; 
private static final int MASK_ATE_DINNER = 0x0002; 
private static final int MASK_SLEPT_WELL = 0x0004; 

// This is my current state 
private int m_nCurState; 

Để thiết trạng thái của tôi, tôi sử dụng bitwise OR:

// Set state for'ate dinner' and 'slept well' to 'on' 
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL); 

Chú ý cách tôi 'hoặc' trạng thái hiện tại của tôi với các trạng thái mà tôi muốn bật 'bật'. Ai biết được tình trạng hiện tại của tôi là gì và tôi không muốn thổi bay nó đi.

Để unset trạng thái của tôi, tôi sử dụng các phép toán AND điều hành với các nhà điều hành bổ sung:

// Turn off the 'ate dinner' flag 
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER); 

Để séc trạng thái hiện tại của tôi, tôi sử dụng và nhà điều hành:

// Check if I did my homework 
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) { 
    // yep 
} else { 
    // nope... 
} 

Tại sao tôi nghĩ điều này thú vị? Nói rằng tôi đang thiết kế một giao diện thiết lập trạng thái của tôi. Tôi có thể viết một phương pháp mà chấp nhận ba boolean:

void setState(boolean bDidHomework, boolean bAteDinner, boolean bSleptWell); 

Hoặc, tôi có thể sử dụng một số duy nhất để đại diện cho tất cả ba trạng thái và thông qua một giá trị duy nhất:

void setState(int nStateBits); 

Nếu bạn chọn mô hình thứ hai bạn sẽ rất hạnh phúc khi quyết định thêm một trạng thái khác - bạn sẽ không phải bẻ khóa các giao diện hiện tại của giao diện của mình.

Hai xu của tôi. Cảm ơn.

+2

Một câu trả lời rất hữu ích! xứng đáng để được trên đầu trang, chắc chắn. – Ace

+21

Cá nhân tôi ghét "mẫu hình" này với sự trả thù. Nó rất gần với mã obfuscation. –

+6

Mặc dù bạn được chào đón với ý kiến ​​của mình, tôi duy trì rằng việc sử dụng các trường bit để lưu trữ trạng thái có thể được làm sạch, súc tích và trong một số trường hợp tối ưu. Nếu đó là cú pháp khiến bạn không thoải mái thì hãy gói các hoạt động theo các phương thức tiện lợi cụ thể của vấn đề và tránh phơi bày việc triển khai bên dưới cho người gọi của bạn. Đối với mã obfuscation, hiện một "mô hình" tồn tại mà không thể bị obfuscated bởi một nhà phát triển thiếu kinh nghiệm? – tyler

12

Đối với các lập trình viên Java, toán tử xor bitwise (^) cung cấp một cách hữu ích để mã hóa phép thử OR độc quyền giữa hai phép toán. Ví dụ:

boolean isFoo = ... 
boolean isBar = ... 

if (isFoo^isBar) { 
    // Either isFoo is true or isBar is true, but not both. 

Lưu ý: không có thao tác bit thực sự xảy ra ở đây nhưng đây là cách hữu ích để sử dụng toán tử xor bitwise (trong tầng web hoặc bất kỳ nơi nào khác).

(Tương tự có thể áp dụng đối với C#, vì nó rất giống với Java. Không chắc, mặc dù.)

+3

Hoặc bạn có thể viết 'if ((isFoo || isBar) && isFoo! = IsBar)' có thể tiết lộ chi tiết hơn, nhưng sẽ có ý nghĩa với bất kỳ ai mà không có chúng phải google là gì '^'. – CorayThan

+1

Điều này thực sự trả lời khi sử dụng các toán tử bitwise? –

+1

Chỉ 'isFoo! = IsBar' sẽ tương đương và rõ ràng hơn. –

0

Lần duy nhất mà tôi đã phải sử dụng chúng bên ngoài cho phép truy cập đã cho một dự án tôi đang làm cho một phân tích cú pháp mà mất Màu ID gán cho ints

tức

$color_red= 1; 
$color_blue = 2; 
$color_yellow = 8; 

$color_purple = 3; 
$color_orange = 9; 
$color_green = 10; 

sau đó tôi đã được đưa ra một tài sản

$can_collect_200_dollars = 10; 

sau đó sử dụng Bitwise để so sánh màu sắc được đưa ra với tài sản

if($given_color & $can_collect_200_dollars) 
{ 
    $yay_i_got_200_dollars = true; 
}else{ 
    $bummer_i_am_going_to_jail = true; 
} 
+1

Ví dụ của bạn không giải thích tại sao bạn cần sử dụng toán tử bitwise. – geoidesic

-2

Tôi nghĩ rằng các nhà khai thác Bitwise rất mạnh nếu được sử dụng một cách thông minh.

Giả sử bạn có "Cửa hàng trực tuyến". Và một số mặt hàng của bạn rơi vào nhiều hơn một danh mục.

Hoặc bạn phải tạo mối quan hệ nhiều-nhiều. Hoặc bạn có thể cung cấp cho Danh mục của bạn một ID nhị phân bổ sung và trong sản phẩm của bạn chỉ lưu trữ định nghĩa Bitwise của Danh mục-ID

Tôi nghĩ rằng trong vài dòng tôi không thể giải thích chi tiết. SORRY

+1

Điều này cũng có thể rất yếu nếu bạn có tấn danh mục. –

+0

Điều này không trả lời câu hỏi OP. – MJoraid

+0

Xin vui lòng chỉnh sửa câu trả lời của bạn để tôi có thể xóa bỏ phiếu giảm giá của mình. Bây giờ tôi sẽ quay lại với tất cả những kẻ thất bại và cố gắng loại bỏ chúng. – MJoraid

5

Câu hỏi này đã được trả lời nhưng tôi muốn chia sẻ kinh nghiệm của mình với &.

Tôi đã sử dụng & một thời gian ngắn trước đây để xác nhận mẫu đăng ký khi tôi đã làm một ASP.NET C# tập thể dục nơi ngắn mạch && sẽ không đạt được hiệu quả mong muốn một cách dễ dàng.

Điều tôi muốn làm là đánh dấu tất cả các trường không hợp lệ trong biểu mẫu và hiển thị nhãn thông báo lỗi ngay bên cạnh mỗi trường không hợp lệ và hủy tất cả các trường hợp lệ và xóa thông báo lỗi khỏi chúng.

Code tôi sử dụng nó là một cái gì đó như thế này:

protected void btnSubmitClicked(...) { 
    username = txtUsername.Text; 
    email = txtEmail.Text; 
    pass = txtPassword.Text; 
    if (isUsernameValid(username) & isEmailValid(email) & isPasswordValid(pass)) { 
    // form is valid 
    } else { 
    // form is invalid 
    } 
    ... 
} 

private bool isPasswordValid(string password) { 
    bool valid = true; 
    string msg = ""; 
    if (password.length < MIN_PASSWORD_SIZE) { 
    valid = false; 
    msg = "Password must be at least " + MIN_PASSWORD_SIZE + " long."; 
    } 

    highlightField(txtPassword, lblPassword, valid, msg); 
    return valid; 
} 

private void highlightField(WebControl field, Label label, string valid, string msg) { 
    if (isValid) { 
    // de-highlight 
    field.BorderColor = VALID_FIELD_COLOR; 
    } else { 
    // highlight the text field and focus on it 
    field.BorderColor = INVALID_FIELD_COLOR; 
    field.Focus(); 
    } 

    label.Text = msg; 
} 

// and other similar functions for username and email 

Đã được tôi sử dụng && thay vì &, nếu-tuyên bố trong btnSubmitClicked phương pháp sẽ làm nổi bật chỉ có lĩnh vực đầu tiên không hợp lệ, và tất cả các khác các trường không hợp lệ sau đó sẽ không được đánh dấu và thông báo lỗi của nó không được hiển thị vì ngắn mạch được lưu hành && sẽ ngừng kiểm tra điều kiện sau khi gặp phải lỗi.

Có thể có cách tốt hơn để đạt được điều tương tự, nhưng tôi thấy & hữu ích tại thời điểm đó.

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