- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
此代码块中波浪号的用途是什么?
public override int GetHashCode()
{
return ~this.DimensionId.Id ^ this.ElementId.Id;
}
^ 运算符(C# 引用) Visual Studio 2010二元 ^ 运算符是为整数类型和 bool 预定义的。对于整数类型,^ 计算其操作数的按位异或。对于 bool 操作数,^ 计算其操作数的逻辑异或;也就是说,当且仅当恰好其中一个操作数为真时,结果为真。
~ 运算符(C# 引用) Visual Studio 2010~ 运算符对其操作数执行按位补码运算,具有反转每一位的效果。为 int、uint、long 和 ulong 预定义了位补运算符。
~(代字号)运算符对其单个整数操作数执行按位补码。 (因此 ~ 运算符是一元运算符,就像 ! 和一元运算符 -、& 和 * 一样。)补数意味着将所有 0 位更改为 1,并将所有 1 更改为 0
为什么在此上下文中使用它(而不是简单地排除它)的原因是什么?
最佳答案
这只是生成哈希码的一种方法。我不太喜欢哈希码中的 XOR,除非你想要一些与顺序无关的东西,但这是一种以相当任意但可重复的方式翻转位的合理方式。
基本上,您在这里有两个 32 位值,您需要以某种形式组合它们以创建另一个 32 位值。代码可以只是将这些值异或在一起而不用任何按位补码:
return DimensionId.Id ^ ElementId.Id;
...但是对于 ElementId.Id == DimensionId.Id
的情况,这将始终为零,这可能并不理想。另一方面,如果两个 ID 相同,我们现在总是以 -1 结束,如评论中所述(doh!)。另一方面,它使 {6, 4} 对具有与 {4, 6} 不同的散列码,而简单的 XOR 则不会……换句话说,它使排序很重要。同样,如果您的真实标识符可能取自相对较小的池,那么这可能很重要。
XOR 本身确保对任一个 ID 中的任何 位的更改对最终哈希码产生影响。
就我个人而言,我通常遵循有效 Java 中 Josh Bloch 的模式,例如
unchecked
{
int hash = 17;
hash = hash * 31 + DimensionId.Id;
hash = hash * 31 + ElementId.Id;
return hash;
}
...但这只是因为以这种方式散列的某些属性1,并且它不会使您所展示的实现在任何意义上都是“错误的”。
1 它似乎在许多常见场景中都能很好地生成不同的值。显然它不能防止散列冲突,但是如果您的 ID 实际上是从 1、2、3 的序列生成的……那么这在现实生活中的冲突中会比 XOR 做得更好。我确实看到了一个分析这种方法的网页以及哪些数字效果很好等等,但我不记得在哪里。
关于c# - 在这种情况下波浪号的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572276/
我目前正在开发一个具有模块化设计的网站,其中包含文本模块、图像模块、2 列模块......用户可以根据需要添加/删除/重新排序它们。 每个模块都有一个波浪形/flex 的边框: 有没有可能用css做这
我正在尝试在网站上创建波浪效果 like this其中有一个主色波(深紫色),然后是沿边缘的浅色波。我已尝试使用 CSS position 和 top 定位多个路径,但无法使它们工作。 这是我的基本波
如何在透明图像背景上构建波浪? 布局图像: 我需要白色顶部背景中的波浪。 最佳答案 我稍微改进了 akshay 的回答版本。这包括两个单独的选项。 选项 1 如果不需要保留宽高比,则曲线将随宽度变化。
我是一名优秀的程序员,十分优秀!