我正在制作一个程序,其中一个问题是我需要对某些整数中的位模式进行一些分析.
因此,我希望能够做到这样的事情:
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
Run Code Online (Sandbox Code Playgroud)
通过这样做,我能够创造出有效的东西:
num.to_s(2).each_char do |c|
#do something with c as a char
end
Run Code Online (Sandbox Code Playgroud)
然而,这没有我想要的性能.
我发现你可以这样做:
0.upto(num/2) do |i|
#do something with n[i]
end
Run Code Online (Sandbox Code Playgroud)
这比该each_char方法的性能更差
这个循环将被执行数百万次或更多次,所以我希望它尽可能快.
作为参考,这是整个功能
@@aHashMap = Hash.new(-1)
#The method finds the length of the longes continuous chain of ones, minus one
#(101110 = 2, 11 = 1, 101010101 = 0, 10111110 = 4)
def afunc(n)
if @@aHashMap[n] != -1
return @@aHashMap[n]
end …Run Code Online (Sandbox Code Playgroud) 我正在尝试进入C编程,而我在编写只有~和&运算符的按位XOR函数时遇到了麻烦.示例:bitXor(4, 5) = 1.我怎样才能做到这一点?
到目前为止我有这个:
int bitXor(int x, int y) {
return z;
}
Run Code Online (Sandbox Code Playgroud) 我使用该~操作进行位操作,我只是想知道Java如何计算负数?
我检查了Java文档:
"一元按位补码运算符"〜"反转位模式;它可以应用于任何整数类型,使每个"0"为"1",每个"1"为"0".例如,一个字节包含8位;将此运算符应用于位模式为"00000000"的值将其模式更改为"11111111"."
那么,如果int a = 60 (0011 1100),那么int c = ~a (1100 0011).
问题是,Java如何计算负数以便1100 0011 = -61?1100 0011计算的唯一方法-61是
-2^6 + 2^1 + 2^0 = -61.但这对我来说毫无意义.
是否有一种方法可用于获取整数位的整数表示?例如,当提供时:0给出0 4给出100 22给出10110
我想根据位字段是真还是假来有条件地选择一些东西.这是我最初尝试的语法:
CASE WHEN isSoon THEN 'Soon' ELSE 'Not so soon' END As HowSoon
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为"WHEN"后面必须是一个布尔表达式isSoon,因为它是一个小字段.但是,这不起作用.我最终要做的是:
CASE WHEN isSoon = 1 THEN 'Soon' ELSE 'Not so soon' END As HowSoon
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是多余的......这就像if(isSoon == True)用编程语言编写而不是更直观,if(isSoon)而且反对谷物.为什么SQL设置如此?是因为位字段不是真正的布尔值吗?
我目前使用这两个函数来打包和读取字节数组中的位.想知道是否有人有更好的想法或更快的方法吗?
通过更多优化编辑程序并提出一些计算.目前100mil的Put and Get大约需要12秒而不是16秒.
如果有人正在使用当前代码,请确保传入Put的值是正数,因为它期望无符号数字下降.如果有兴趣,我可以提出签名和未签名的版本.
class BitData
{
static void Put(byte Data[], final int BitOffset, int NumBits, final int Value)
{
final long valLong=(Value&((1L<<NumBits)-1L));
int posByte=BitOffset>>3;
int posBit=BitOffset&7;
int valByte;
int ModifyBits;
long lValue;
int LeftShift;
ModifyBits=8-posBit;
if(NumBits<ModifyBits) ModifyBits=NumBits;
LeftShift=(8-posBit-ModifyBits);
while(true)
{
valByte = Data[posByte];
if(ModifyBits==8)
{
lValue=valLong<<(32-NumBits)>>(24);
Data[posByte]=(byte)lValue;
}
else
{
lValue=valLong<<(32-NumBits)>>(32-ModifyBits)<<LeftShift;
Data[posByte]=(byte)((valByte & ~(((1<<ModifyBits)-1) << LeftShift)) | lValue);
}
NumBits-=ModifyBits;
if(NumBits==0) break;
posByte++;
ModifyBits=8;
if(NumBits<ModifyBits)
{
ModifyBits=NumBits;
LeftShift=(8-ModifyBits);
}
}
}
static int GetInt(byte Data[], final int BitOffset, …Run Code Online (Sandbox Code Playgroud) 在C#中,我有一个32位值,我将其存储在int中.我需要查看是否设置了特定位.我需要的是0x00010000.
我想出了这个解决方案:
这是我正在寻找的:
Hex: 0 0 0 1 0 0 0 0 0 Binary 0000|0000|0000|0001|0000|0000|0000|0000|0000
所以我右移16号,这会给我:
Hex: 0 0 0 0 0 0 0 0 1 Binary 0000|0000|0000|0000|0000|0000|0000|0000|0001
我然后向左移3,这会给我:
Hex: 0 0 0 0 0 0 0 0 8 Binary 0000|0000|0000|0000|0000|0000|0000|0000|1000
然后我将我的32位值设置为一个字节,看看它是否等于8.
所以我的代码将是这样的:
int value = 0x102F1032;
value = value >> 16;
byte bits = (byte)value << 3;
bits == 8 ? true : false;
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来检查是否在没有所有移位的情况下设置了特定位?
我是编程新手.最近我遇到了一个问题,我必须在一个数字的特定位0.
例如 :
我有一个数字p
p = 73
binary = 1001001
Run Code Online (Sandbox Code Playgroud)
现在我想将第4位设为0,即1000001(2)= 65(10)
我是按照以下方式做到的:
int p = 73;
int pos = 1<<3; // 4th bit
int max_bit = (1<<31) - 1; // making all bit to 1
int mask = pos ^ max_bit; // making 4th bit to 0 except others
p = p & mask; // changing 4th bit of p to 0
cout<<p<<endl;
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗 ?
我有一组位串:({'0011', '1100', '1110'}一组中的所有位串都具有相同的长度)。
我想快速找到与集合最大相似度最小的相同长度的位串。最大相似度可以这样计算:
def max_similarity(bitstring, set):
max = 0
for item in set:
temp = 0
for i in range(len(bitstring)):
if bitstring[i] == item[i]:
temp += 1
if temp > max:
max = temp
return max
Run Code Online (Sandbox Code Playgroud)
我知道我可以遍历该长度的所有可能的位串,计算每个位的最大相似度,最后保留这些迭代中的最小者。但这解决了O(2 ^ n)中的问题。我想知道是否有人看到任何更快的选择。
我一直在玩Pythons XOR:
def int2bin(integer, digits):
if integer >= 0:
return bin(integer)[2:].zfill(digits)
else:
return bin(2**digits + integer)[2:]
def XOR(bitset):
intset = [int('{}'.format(bitstring), 2) for bitstring in bitset]
digits = len(bitset.pop())
if len(intset) == 1:
return int2bin(~intset.pop(), digits)
else:
curr …Run Code Online (Sandbox Code Playgroud)