我会感谢一个很好的教程,为Java新手解释如何在java中所有的"位移"工作.
我总是偶然发现它,但从未理解它是如何工作的.它应该解释java中使用byteshifting/bitmanipulation可能实现的所有操作和概念.
这只是我的意思的一个例子,(但我正在寻找一个解释每个可能的操作的教程):
byte b = (byte)(l >> (8 - i << 3));
Run Code Online (Sandbox Code Playgroud) 当我正在学习C时,我只是经历了一些基本的东西.我遇到了一个问题,即在不使用*运算符的情况下将数字乘以7.基本上就是这样的
(x << 3) - x;
Run Code Online (Sandbox Code Playgroud)
现在我知道基本的位操作操作,但我不知道如何在不使用*运算符的情况下将数字乘以任何其他奇数?这是一般的算法吗?
我有标志位的问题.我有一个int
变量来保存标志.首先,我为该变量设置了一些标志.后来我需要检查该变量中设置了多少个标志.但我不知道这样做.
我必须以整数的二进制表示形式翻转所有位.鉴于:
10101
Run Code Online (Sandbox Code Playgroud)
输出应该是
01010
Run Code Online (Sandbox Code Playgroud)
与整数一起使用时,实现此操作的按位运算符是什么?例如,如果我正在写一个类似的方法int flipBits(int n);
,身体会发生什么?我只需要翻转数字中已经存在的内容,而不是整数中的所有32位.
一个伟大的编程资源,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) 给定一个整数数组,您必须找到两个XOR最大的元素.
有天真的方法 - 只需挑选每个元素和xoring与其他元素,然后比较结果找到对.
除此之外,有没有有效的算法?
我看到下面的代码行这里的C.
int mask = ~0;
Run Code Online (Sandbox Code Playgroud)
我已经打印了mask
C和C++ 的值.它总是打印-1
.
所以我确实有一些问题:
~0
要为掩码变量赋值?~0
什么?-1
而不是~0
吗?我正面临着这个基于输入参数生成位掩码的独特问题.例如,
如果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)
我想知道是否有更好的算法~~~
在执行按位运算之前,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) 在以下代码中:
short = ((byte2 << 8) | (byte1 & 0xFF))
Run Code Online (Sandbox Code Playgroud)
目的是&0xFF
什么?因为其他有时我认为它写成:
short = ((byte2 << 8) | byte1)
Run Code Online (Sandbox Code Playgroud)
这似乎也很好吗?