当前位置:  开发笔记 > 编程语言 > 正文

何时在Web开发期间使用Bitwise Operators?

如何解决《何时在Web开发期间使用BitwiseOperators?》经验,为你挑选了5个好方法。

虽然我掌握了Bitwise Operators的概念,但我不能说在Web开发过程中我遇到了很多用例,我不得不求助于使用Bitwise Operators.

你使用Bitwise运算符吗?

你为什么用它们?

什么是一些示例用例?

请记住,此问题专门用于在Web语言中使用Bitwise Operators.



1> tyler..:

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

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

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

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

注意我'或'我目前处于与我想要打开的状态的状态.谁知道我现在的状态是什么,我不想把它吹走.

取消设置状态,我使用带有补码运算符的按位AND运算符:

// 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...
}

为什么我认为这很有趣?假设我正在设计一个设置我的状态的界面.我可以写一个接受三个布尔值的方法:

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

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

void setState( int nStateBits);

如果您选择第二种模式,那么在决定添加另一种状态时您会非常高兴 - 您不必破坏现有的界面.

我的两分钱.谢谢.


就个人而言,我讨厌复仇这种"模式".它非常接近代码混淆.
虽然欢迎您的意见,但我认为使用位字段存储状态可以是干净,简洁,在某些情况下是最佳的.如果是让您感到不舒服的语法,则将操作打包在特定于问题的便捷方法中,并避免将底层实现暴露给您的调用者.对于代码混淆,是否存在无法被缺乏经验的开发人员混淆的"模式"?
一个非常有用的答案!当然,应该是最重要的.
有史以来最好的位图教程.精炼到位.我刚刚学会了位图的工作方式而没有尝试.

2> Jon Skeet..:

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

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

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

要么

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

转移运营商都在我的经验,"企业"应用程序的那么有用.


Downvoters:请解释你的downvotes,否则他们没有意义.
@Hnatt:没错 - 除非你的业务提供加密功能,否则它几乎不是*业务*逻辑.
+1,但是在加密方面,转移操作并没有那么无用.例如,MD5 algorythm使用位移.这可能是一个糟糕的例子,因为MD5已经在PHP中实现,但这是我想到的第一件事.
是的,加密功能业务仍然是业务.哦,还有一件事.如果您的业务使用RGB或HSL颜色,那么位移也可以帮助您.

3> 小智..:

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

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

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

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

(同样可能适用于C#,因为它与Java非常相似.但不确定.)


或者你可以编写`if((isFoo || isBar)&& isFoo!= isBar)`这可能更详细,但对于任何没有他们必须google什么`^`的人都会有意义.
这是否真的回答何时使用按位运算符?

4> Robert Gould..:

除了标志之外,没有太多理由在脚本语言中使用位操作.但是,一旦深入研究堆栈的较低级别,位操作就变得越来越重要.



5> RestInPeace..:

这个问题已经回答了,但我想与大家分享一下我的经验&.

我在&不久前用过一段时间来验证一个注册表单,当我进行ASP.NET C#练习时,短路&&不能轻易达到预期的效果.

我想要做的是突出显示表单中的所有无效字段,并在每个无效字段旁边显示错误消息标签,并取消所有有效字段的高亮显示并从中删除错误消息.

我用它的代码是这样的:

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

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

可能有更好的方法来实现同样的目标,但我觉得&当时很有用.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有