在Apple关于与C API交互的文档中,他们描述了NS_ENUM以Swift枚举方式导入标记的C风格枚举的方式.这是有道理的,因为Swift中的枚举很容易作为enum值类型提供,所以很容易看到如何创建自己的.
更进一步,它说这是关于NS_OPTIONS标记的C风格选项:
Swift还导入标有
NS_OPTIONS宏的选项.而选项的行为类似于进口枚举,选项还可以支持一些位操作,如&,|和~.在Objective-C中,表示使用常量零(0)设置的空选项.在Swift中,用于nil表示没有任何选项.
鉴于optionsSwift中没有值类型,我们如何创建一个C-Style选项变量来使用?
我是一个只是为了好玩而编写代码的人,并没有在学术或专业环境中深入研究它,所以像这些按位运算符这样的东西真的让我感到厌烦.
我正在阅读一篇关于JavaScript的文章,它显然支持按位操作.我一直看到这个地方提到的这个操作,我试着去弄清楚究竟是什么,但我似乎根本没有得到它.那他们是什么?清楚的例子会很棒!:d
还有几个问题 - 按位运算的一些实际应用是什么?你何时可以使用它们?
我看到了一个我以前从未见过的循环:
for (int i = 0; i < (1 << list.Count); i++)
Run Code Online (Sandbox Code Playgroud)
我无法理解是什么(1 << list.Count)意思,也许有人可以解释我这个?
按位运算符应该传输变量并逐位操作它们.在整数,longs,chars的情况下这是有道理的.这些变量可以包含由其大小强制执行的所有值.
但是,在布尔值的情况下,布尔值只能包含两个值.1 =真或0 =假.但是没有定义布尔值的大小.它可以大到一个字节或一点点.
那么在布尔值上使用按位运算符会产生什么影响呢?JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果未定义以及布尔值的大小?
我知道规则&&,||但是什么是&和|?请以一个例子向我解释这些.
在以下行中:
//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;
Run Code Online (Sandbox Code Playgroud)
在C#中,|=(单管道相等)和&=(单个&符号相等)是什么意思
我想删除系统属性并保留其他属性...
我遇到过一个(看似很奇怪的)非常奇怪的案子.
取数字2(0b10)并用1(0b01)进行位掩码
这应该产生0b00相当于0的东西.
然而,这里是薛定谔先生进来的地方:
var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)
Run Code Online (Sandbox Code Playgroud)
威士忌酒.探戈.狐步舞.
不可否认,对于按位运算符来说,我并不是最敏锐的 - 所以也许我在某个地方有可怕的,可怕的错误?
但是,在Python中:
0b10 & 0b01 == 0 = True
0b10 & 0b01 != 0 = False
...所以?
如果您在这里阅读jQuery inArray页面上的注释,那么有一个有趣的声明:
!!~jQuery.inArray(elm, arr)
Run Code Online (Sandbox Code Playgroud)
现在,我相信双感叹号会将结果转换为类型boolean,值为true.我不明白的是,~在所有这些中使用了tilde()运算符是什么?
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Run Code Online (Sandbox Code Playgroud)
重构if声明:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Run Code Online (Sandbox Code Playgroud)
分解:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
Run Code Online (Sandbox Code Playgroud)
我也注意到,如果我把波浪号放在前面,结果是-2.
~!!~jQuery.inArray("one", arr) // -2
Run Code Online (Sandbox Code Playgroud)
我不明白这里代字号的目的.有人可以解释一下或指向我的资源吗?
当了解如何原始的运营商,如+,-,*并/用C实现,我发现从下面的代码片段一个有趣的答案.
// replaces the + operator
int add(int x, int y) {
while(x) {
int t = (x & y) <<1;
y ^= x;
x = t;
}
return y;
}
Run Code Online (Sandbox Code Playgroud)
似乎此函数演示了如何+在后台实际工作.但是,理解它对我来说太困惑了.我相信这样的操作是使用编译器生成的汇编指令很长时间完成的!
我的问题是:+运算符是否作为MOST实现上发布的代码实现?这是否利用了两个补码或其他依赖于实现的功能?如果有人能解释它是如何工作的,我会非常感激.
嗯...也许这个问题在SO上有点偏离主题,但我认为通过这些运算符来看是有点好的.