标签: bit-manipulation

Java"Bit Shifting"教程?

我会感谢一个很好的教程,为Java新手解释如何在java中所有的"位移"工作.

我总是偶然发现它,但从未理解它是如何工作的.它应该解释java中使用byteshifting/bitmanipulation可能实现的所有操作和概念.

这只是我的意思的一个例子,(但我正在寻找一个解释每个可能的操作的教程):

byte b = (byte)(l >> (8 - i << 3));
Run Code Online (Sandbox Code Playgroud)

java bit-manipulation bit-shift

46
推荐指数
6
解决办法
9万
查看次数

如何在没有'*'运算符的情况下执行乘法运算?

当我正在学习C时,我只是经历了一些基本的东西.我遇到了一个问题,即在不使用*运算符的情况下将数字乘以7.基本上就是这样的

      (x << 3) - x;
Run Code Online (Sandbox Code Playgroud)

现在我知道基本的位操作操作,但我不知道如何在不使用*运算符的情况下将数字乘以任何其他奇数?这是一般的算法吗?

c c++ java bit-manipulation

45
推荐指数
10
解决办法
4万
查看次数

检查标志位java

我有标志位的问题.我有一个int变量来保存标志.首先,我为该变量设置了一些标志.后来我需要检查该变量中设置了多少个标志.但我不知道这样做.

java flags bit-manipulation

45
推荐指数
4
解决办法
3万
查看次数

用于简单地翻转整数中所有位的按位运算符?

我必须以整数的二进制表示形式翻转所有位.鉴于:

10101
Run Code Online (Sandbox Code Playgroud)

输出应该是

01010
Run Code Online (Sandbox Code Playgroud)

与整数一起使用时,实现此操作的按位运算符是什么?例如,如果我正在写一个类似的方法int flipBits(int n);,身体会发生什么?我只需要翻转数字中已经存在的内容,而不是整数中的所有32位.

java binary bit-manipulation bit bitwise-operators

45
推荐指数
4
解决办法
8万
查看次数

快速计算64位整数的log2

一个伟大的编程资源,Bit Twiddling Hacks,提出(这里)以下方法来计算32位整数的log2:

#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
static const char LogTable256[256] = 
{
    -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
    LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
    LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
};

unsigned int v; // 32-bit word to find the log of
unsigned r;     // r will be lg(v)
register …
Run Code Online (Sandbox Code Playgroud)

c lookup 64-bit bit-manipulation 32bit-64bit

45
推荐指数
6
解决办法
3万
查看次数

数组中的两个元素,其xor是最大的

给定一个整数数组,您必须找到两个XOR最大的元素.

有天真的方法 - 只需挑选每个元素和xoring与其他元素,然后比较结果找到对.

除此之外,有没有有效的算法?

arrays algorithm bit-manipulation xor

44
推荐指数
3
解决办法
3万
查看次数

"int mask =〜0;"的目的是什么?

我看到下面的代码行这里的C.

 int mask = ~0;
Run Code Online (Sandbox Code Playgroud)

我已经打印了maskC和C++ 的值.它总是打印-1.

所以我确实有一些问题:

  • 为什么~0要为掩码变量赋值?
  • 目的是~0什么?
  • 我们可以用-1而不是~0吗?

c c++ bit-manipulation masking bit-masks

44
推荐指数
4
解决办法
4066
查看次数

生成位掩码的算法

我正面临着这个基于输入参数生成位掩码的独特问题.例如,

如果param = 2,那么如果param = 5,则掩码将为0x3(11b),然后掩码将为0x1F(1 1111b)

这是我在C中使用for循环实现的

int nMask = 0;
for (int i = 0; i < param; i ++) {

    nMask |= (1 << i);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的算法~~~

algorithm bit-manipulation

43
推荐指数
4
解决办法
5万
查看次数

32位无符号整数的按位运算?

在执行按位运算之前,JavaScript会将操作数转换为32位有符号整数.它还使用32位有符号整数执行操作,这意味着结果是32位有符号整数.

因为我想用32位无符号整数进行按位运算,我想知道是否有办法使用JavaScript的错误结果来找出预期的结果.

为了证明我的想法,例如,在C中,这是我想要的参考,

unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
Run Code Online (Sandbox Code Playgroud)

在JavaScript中,

 var a = 3774191835;
 var b = a >> 2;
 /* b == -130193866 */
Run Code Online (Sandbox Code Playgroud)

让我们尝试不同的操作.在C中,

unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */
Run Code Online (Sandbox Code Playgroud)

在JavaScript中,

 var a = 1986735448;
 var b = a << 1;
 /* b == -321496400 */
Run Code Online (Sandbox Code Playgroud)

既然JavaScript已经使用操作数作为带符号的int来评估我的按位运算,那么我们当然会得到与C中的结果不同的结果,我们可以在无符号整数上正确执行按位运算.

我知道这是可能的,但我不确定一种方法,基本上,我可以将JavaScript的结果转换为预期的结果.


零填充右移将结果归零仅适用于第二种情况,但不适用于第一种情况.

 var a = 3774191835;
 var b = …
Run Code Online (Sandbox Code Playgroud)

javascript bit-manipulation

42
推荐指数
1
解决办法
1万
查看次数

AND 0xFF做什么?

在以下代码中:

short = ((byte2 << 8) | (byte1 & 0xFF))
Run Code Online (Sandbox Code Playgroud)

目的是&0xFF什么?因为其他有时我认为它写成:

short = ((byte2 << 8) | byte1)
Run Code Online (Sandbox Code Playgroud)

这似乎也很好吗?

c bit-manipulation bit-shift bitwise-operators

41
推荐指数
5
解决办法
8万
查看次数