什么时候在web开发中使用按位运算符?

尽pipe我把握了位运算符的概念,但是我不能说在我不得不求助于使用位运算符的web开发过程中遇到了很多用例。

  • 你使用位运算符?
  • 你为什么要用它们?
  • 什么是一些示例用例?

请记住,这个问题专门用于网页语言的位运算符。

对于按位运算符,我的主要用途可能与任何地方有关 – 代表一组标志。 例如,您可能在数据库中有一个整数代表一组用户的安全权限,在您的Web应用程序中,您必须在继续之前检查这些权限。

那些往往只需要&| – 例如

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

要么

 Permission requiredPermission = Permission.CreateUser | Permission.ChangePassword; 

根据我的经验, 移位操作符在“业务”应用程序中用处不大。

我将在这里更加明确,因为我认为位掩码是一个伟大的工具,应该在任何开发者带。 我将尝试扩展上面的答案。 首先,使用一个整数来维护状态标志的一个例子(常见用法):

 // 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; 

设置我的状态,我使用按位或运算符:

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

注意我如何“或”我目前的状态与我想打开的状态。 谁知道我目前的状态是什么,我不想把它吹走。

为了解除我的状态,我使用了与运算符的补码运算符:

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

检查我目前的状态,我使用AND运算符:

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

为什么我觉得这很有趣? 说我正在devise一个界面,设置我的状态。 我可以写一个接受三个布尔值的方法:

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

或者,我可以用一个数字来表示所有三个状态并传递一个值:

 void setState( int nStateBits); 

如果你select第二种模式,当决定添加另一个状态时,你会非常高兴 – 你不必打破现有的界面impls。

我的两分钱 谢谢。

对于Java程序员来说,异或运算符(^)提供了一种有用的方法来编写两个布尔值之间的异或testing。 例:

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

注意:这里没有实际的位操作,但是这是使用xor按位运算符(在web层或其他任何地方)的有用方法。

(这同样适用于C#,因为它与Java非常相似,不过不确定。

除了标志之外,在脚本语言中使用位操作没有太大的理由。 但是一旦你深入到你的堆栈中,位操作变得越来越重要。

这个问题已经回答了,但是我想和大家分享我的经验。

当我在做一个ASP.NET C#练习时,我已经使用&不久之前validation了一个registry单,在这个练习中短路的&&不会轻易达到预期的效果。

我想要做的是突出显示窗体中的所有无效字段,并在每个无效字段旁边显示一条错误消息标签,并重新设置所有有效字段并从中删除错误消息。

我使用的代码是这样的:

 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 

如果我使用&&而不是& ,则btnSubmitClicked方法中的if语句只会突出显示第一个无效字段,之后的所有其他无效字段将不会突出显示,并且不会显示其错误消息,因为短路&&会停止在遇到错误之后检查条件。

可能有更好的方法来实现同样的事情,但我发现&有用的时间。

一般来说,您不需要关注位级别的操作。 您可以用字节,整数,双精度和其他更高级别的数据types来思考。 但有些时候,你想能够达到个人的水平。

按位运算符最常见的使用情况之一是标志 (php示例)。 按位运算符也用于二进制文件IO操作。

我经常使用它们,但从来没有在我可以避开它们的地方。 我经常使用的是以下两种情况。

  1. 在不通过安全连接的情况下,使用JavaScript对来自客户端的表单数据进行encryption,但并不比发送纯文本要好。
  2. stream式传输PHP中生成的文件结构(通常是一些二进制文件types)。

在事物的离题方面,在高级语言中,特别是在parsing语言(比如PHP)中,按位运算比正常运算要慢得多。 所以,从性能的angular度来看,Jon的权限检查可能是不错的,但是在networking域名中并不是非常“原生”的。

我唯一不得不在授权访问之外使用它们的是我为一个parsing器所做的项目,该parsing器将颜色ID分配给了整数

 $color_red= 1; $color_blue = 2; $color_yellow = 8; $color_purple = 3; $color_orange = 9; $color_green = 10; 

然后给我一个财产

 $can_collect_200_dollars = 10; 

然后按位比较给出的属性的颜色

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

我认为如果聪明地使用,那么按位运算符是非常强的。

假设你有一个“在线商店”。 而你的一些物品落在更多的类别。

要么你必须创build一个多对多的关系。 或者您可以给您的类别一个额外的二进制ID,并在您的产品中存储类别ID的按位组合

我觉得我不能详细解释。 抱歉