【问题标题】:Replacement for java bitwise operator in objective c替换目标c中的java按位运算符
【发布时间】:2012-03-13 11:28:03
【问题描述】:

如何将以下代码转换为目标 c? (值是一个整数)

while (value != 0) {
    value >>>= 1;

还有 >>> 操作符的通用替代品吗?

【问题讨论】:

  • >>> 运算符基本上是>> 运算符的未签名版本。理论上,如果您在 C 中的无符号操作数上使用 >>,您将获得 Java 中 >>> 运算符的效果(无符号数据类型 >= 32 位宽度)。

标签: objective-c bit-manipulation code-translation


【解决方案1】:

不直接支持该操作,所以需要使用掩码。根据value 变量的大小,您需要选择不同大小的掩码。 如果valueshort,则使用0x7FFF;如果valuelong long,则使用0x7FFFFFFFFFFFFF

while (value != 0) {
    value >>= 1;
    value &= 0x7FFFFFFF;
}

或者,您可以将value 声明为无符号:然后常规移位分配不会对value 进行符号扩展。事实上,>>> 运算符被添加到 Java 的很大一部分原因是该语言中没有无符号类型。

【讨论】:

  • 更新了我的问题,>>> 操作符有通用替代品吗?
  • 这是否意味着我可以改变:((y >>> 1) + (x / 3)) & 0x1;到 ((y >> 1 & 0x7FFFFFFF) + (x / 3)) & 0x1;
  • @danielbeard 为了安全起见,您需要额外的一对括号:(((y >> 1) & 0x7FFFFFFF) + (x / 3)) & 0x1。您应该考虑改用无符号类型,那么它就是((y >> 1) + (x / 3)) & 0x1
  • 在我看来,如果你将value 转换为无符号,你不应该需要&= 操作。不过,从未尝试过。
  • @HotLicks 我认为您也可以通过强制转换来避免使用掩码,但最好始终使用无符号类型。
猜你喜欢
  • 2015-11-11
  • 2011-05-08
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多