我试图找到有关<<和>>运算符如何处理整数的确切信息,但我找不到一个明确的答案(文档在这方面并不是那么好).
语义的两个部分对我来说并不清楚.首先,哪些位"移入"?
0b1110_1010u8 << 4 == 0b1010_0000u8)移入,或0b1110_1010u8 << 4 == 0b1010_1110u8),或此外,移位如何使用有符号整数?符号位是否也参与了班次?或者这是未指定的?
我正在从单色位图中读取位.我short以相反的顺序将每16位存储在a 中.如果位图中的位为黑色,则存储1.如果为白色,则存储0.
例如:对于位图:bbbw bbbw bbbw wwww
我的简称是:0000 0111 0111 0111
我尝试这样做的第一种方式是:
short m;
// ...
Color c = bmp.GetPixel(j, i);
if (c.R == Color.Black)
m |= short.MinValue;
m >>= 1;
// ...
Run Code Online (Sandbox Code Playgroud)
经过一次任务和班次后,我得到了预期的-32768(1000 0000 0000 0000).
第二次我得到-16384(1100 0000 0000 0000).
我更改了我的代码使用ushort并将if行更改为s |= (ushort)Math.Pow(2, 15);现在它的工作原理.
我的问题是:为什么标志位不会在.NET中转移?有没有办法改变标志位?
是否有任何特殊原因导致这些缺失?
它们确实存在BigInteger,但由于它们的不可变设计模式BigInteger通常非常慢.BitSet是好得多,因为它是可变的,但我真的很怀念shift功能(<<和>>>为longS).因为BitSet,就地移位也是有用的,以及循环旋转.
我已经看到了对Shifting a Java BitSet的回复(get(off, len)用于移位;但这需要复制).
别误会我的意思.我知道在哪里报告错误.我只是想知道是否有一个特别的理由要省略它们,例如一些设计模式或这样的概念.特别是因为它们被包括在内BigInteger.
我正在寻找有关Google Go语言的信息.在"A Tour of Go"中他们有这样的代码:
const (
Big = 1<<100
Small = Big>>99
)
Run Code Online (Sandbox Code Playgroud)
但是做什么<<和>> 意味着什么?
您可以在http://tour.golang.org/#14上查看所有代码
我正在为一个非常有限的系统编写一些代码,其中mod运算符非常慢.在我的代码中,模数需要每秒使用大约180次,并且我认为尽可能地删除它会显着提高代码的速度,因为现在我的主循环的一个循环不会在1/60的情况下运行应该是第二个.我想知道是否有可能仅使用乘法和除法可能的位移来重新实现模数.所以这是我目前在c ++中的代码(如果我可以使用汇编执行模数,那就更好了).如何在不使用除法或乘法的情况下删除模数?
while(input > 0)
{
out = (out << 3) + (out << 1);
out += input % 10;
input = (input >> 8) + (input >> 1);
}
Run Code Online (Sandbox Code Playgroud)
编辑:其实我意识到我需要每秒超过180次.看作输入值可以是一个非常大的数字,最多40位数.
任何人都可以解释以下语法吗?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
Run Code Online (Sandbox Code Playgroud)
我知道它设置的位var,但我无法理解语法.
Scala中的>>和>>>运算符有什么区别吗?
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
Run Code Online (Sandbox Code Playgroud) 有人可以解释为什么以下按位表达式返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
Run Code Online (Sandbox Code Playgroud) 对于以下程序:
public class ZeroFillRightShift
{
public static void main(String args[])
{
int x = -1;
int y = x>>>1;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
Run Code Online (Sandbox Code Playgroud)
我得到如下输出:
x = -1
y = 2147483647
Run Code Online (Sandbox Code Playgroud)
我得到的结果-1>>>1是2147483647.如果它是必须移位的符号位,正如我所知,结果应该是1073741824.为什么它是2147483647呢?
下图更清楚地说明了我的问题:
在.NET 4.5中,这种密码在32位和64位架构上运行良好.将项目切换到.NET 4.6会在64位中完全破解此密码,而在32位中,这个问题会出现奇怪的补丁.
在我的方法"DecodeSkill"中,SkillLevel是在.NET 4.6上打破的唯一部分. 这里使用的变量从网络流中读取并进行编码.
DecodeSkill(始终为SkillLevel返回正确的解码值)
private void DecodeSkill()
{
SkillId = (ushort) (ExchangeShortBits((SkillId ^ ObjectId ^ 0x915d), 13) + 0x14be);
SkillLevel = ((ushort) ((byte)SkillLevel ^ 0x21));
TargetObjectId = (ExchangeLongBits(TargetObjectId, 13) ^ ObjectId ^ 0x5f2d2463) + 0x8b90b51a;
PositionX = (ushort) (ExchangeShortBits((PositionX ^ ObjectId ^ 0x2ed6), 15) + 0xdd12);
PositionY = (ushort) (ExchangeShortBits((PositionY ^ ObjectId ^ 0xb99b), 11) + 0x76de);
}
Run Code Online (Sandbox Code Playgroud)
ExchangeShortBits
private static uint ExchangeShortBits(uint data, int bits)
{
data &= 0xffff;
return (data …Run Code Online (Sandbox Code Playgroud)