草庐IT

objective-c - 了解按位与运算符

coder 2023-04-26 原文

我一直在 Kochan 的《Objective-C 编程》一书中阅读有关 Objective-C 中位运算符的内容。

我对这部分感到非常困惑,尽管到目前为止我已经真正理解了大多数其他呈现给我的东西。

这是书中的一段话:

位与运算符

按位与经常用于屏蔽操作。也就是说,该运算符可以很容易地用于将数据项的特定位设置为 0。例如,语句

w3 = w1 & 3;

将 w1 的值与常数 3 按位与运算分配给 w3。这与将 w 中的所有位设置为相同的效果,除了最右边的两位为 0 并保留 w1 的最右边的两位。

与 C 中的所有二进制算术运算符一样,二进制位运算符也可以通过添加等号用作赋值运算符。声明

word &= 15;

因此执行与以下相同的功能:

word = word & 15;

此外,它具有将字的最右边四位以外的所有位设置为 0 的效果。在执行按位运算时使用常量时,通常以八进制或十六进制表示法表示常量更方便。

好的,这就是我想要理解的。现在,我对几乎整个概念都感到非常困惑,如果有人愿意帮助我,我只是想澄清一下。

当本书现在提到“设置所有位”时,所有位.. 究竟是什么位。这不就是二基数的 0 或 1,也就是二进制吗?

如果是这样,为什么在第一个示例中,除了“最右边的 2”之外的所有位都为 0?是 2 因为它是 3 - 1,从我们的常数中取 3?

谢谢!

最佳答案

数字可以像这样用二进制表示:

3    = 000011
5    = 000101
10   = 001010

...等等。我假设你熟悉二进制。

按位与表示取两个数字,将它们排成一行,然后创建一个新数字,其中两个数字都为 1(其他数字均为 0)。

例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

按位或表示取两个数字,将它们排成一行,然后创建一个新数字,其中一个数字为 1(其他数字均为 0)。

例如:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

按位异或(异或)意味着取两个数字,将它们排成一行,然后创建一个新的数字,其中一个数字为 1,另一个数字为 0(其他所有数字都是0).

例如:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

按位或非(非或)意味着取两个数的按位或,然后将所有内容取反(有 0,现在有 1,有 1,现在有 0)。

按位与非(非与)意味着取两个数字的按位与,然后将所有内容反转(有 0,现在有 1,有 1,现在有 0)。

继续:为什么 word &= 15将除了最右边的 4 位之外的所有位都设置为 0?你现在应该可以弄清楚了……

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

( 0 AND a = 0 , 0 AND b = 0 , ... j AND 1 = j , i AND 1 = i , ...)

这有什么用?在许多语言中,我们使用称为“位掩码”的东西。位掩码本质上是一个数字,代表一大堆组合在一起的较小数字。我们可以使用 OR 将数字组合在一起,并使用 AND 将它们分开。例如:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

如果我只有 map 和帽子,我可以表示为 myInventoryBitmask = (MagicMap | MagicHat)结果是我的位掩码。如果我什么都没有,那么我的位掩码是 0。如果我想看看我是否有我的魔杖,那么我可以这样做:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}

明白了吗?

编辑:更多内容

您还会遇到“bitshift”运算符:< 和="">>。这只是意味着“将所有内容左移 n 位”或“将所有内容右移 n 位”。

换句话说:

1 << 3 = 0001 << 3 = 0001000 = 8

还有:

8 >> 2 = 01000 >> 2 = 010 = 2

关于objective-c - 了解按位与运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427585/

有关objective-c - 了解按位与运算符的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  5. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  6. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  7. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  8. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  9. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  10. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

随机推荐