标签: bit-manipulation

在 Java 中,如何以整数的反转二进制形式获取 1 的位置?

我有一个遗留应用程序,它接受一个整数,将其转换为二进制字符串,反转该字符串,然后将位(一个)的位置作为整数列表获取。例如:

6 -> "110" -> "011" -> (2,3) 
7 -> "111" -> "111" -> (1,2,3)
8 -> "1000" -> "0001" -> (4)
Run Code Online (Sandbox Code Playgroud)

在没有 String 操作的现代 Java 中,有什么简洁明了的方法来实现这一点?与 String 的转换对我来说似乎很浪费,而且我知道String.reverse()无论如何都没有简单的方法来翻转 String (no )。

java binary bit-manipulation

57
推荐指数
13
解决办法
3394
查看次数

是否有一种优雅的方法来在SQL插入语句中反转位值?

我正在转换SQL Server中的一些数据:

INSERT INTO MYTABLE (AllowEdit)
(Select PreventEdit from SOURCETABLE)
Run Code Online (Sandbox Code Playgroud)

所以我需要从源表中反转位值.我期望NOT工作,因为这是我在代码中的方式,但事实并非如此.我能想到的最优雅的方式是:

INSERT INTO MYTABLE (AllowEdit)
(Select ABS(PreventEdit -1) from SOURCETABLE)
Run Code Online (Sandbox Code Playgroud)

有更标准的方法吗?

sql sql-server bit-manipulation

56
推荐指数
2
解决办法
2万
查看次数

按位XOR(异或)是什么意思?

我试图理解C#中的二元运算符,或者一般,尤其是^ - exclusive或.

例如:

给出一组正整数.除了一个出现奇数次数的数字之外,所有数字都出现偶数次.在O(n)时间和恒定空间中找到数字.

这可以通过^完成,如下所示:对所有元素进行按位异或.最后我们得到奇数出现的数字.

它是如何工作的?

当我做:

int res = 2 ^ 3;  
res = 1;  
int res = 2 ^ 5;  
res = 7;  
int res = 2 ^ 10;  
res = 8;  
Run Code Online (Sandbox Code Playgroud)

实际发生了什么?还有什么其他的魔法?我可以查阅任何参考资料并了解更多信息吗?

language-agnostic math bit-manipulation operators xor

55
推荐指数
5
解决办法
7万
查看次数

警告:左移计数> =类型的宽度

我很擅长处理比特,并且在编译时遇到以下警告:

 7: warning: left shift count >= width of type
Run Code Online (Sandbox Code Playgroud)

我的第7行看起来像这样

unsigned long int x = 1 << 32;
Run Code Online (Sandbox Code Playgroud)

如果long我的系统的大小是32位,这将是有意义的.但是,sizeof(long)返回8CHAR_BIT定义为8建议long应为8x8 = 64位长.

我在这里错过了什么?是sizeofCHAR_BIT不准确还是我误解了一些基本的东西?

c bit-manipulation bit-shift long-integer

54
推荐指数
2
解决办法
5万
查看次数

检查是否设置了位

如何检查字节中的某个位是否已设置?

bool IsBitSet(Byte b,byte nPos)
{
   return .....;
}
Run Code Online (Sandbox Code Playgroud)

.net c# bit-manipulation

53
推荐指数
6
解决办法
8万
查看次数

有符号整数上的算术位移

我试图弄清楚算术位移运算符在C中是如何工作的,以及它将如何影响带符号的32位整数.

为简单起见,假设我们在一个字节(8位)内工作:

x = 1101.0101
MSB[ 1101.0101 ]LSB
Run Code Online (Sandbox Code Playgroud)

在Stack Overflow和一些网站上阅读其他帖子,我发现: <<将转向MSB(在我的情况下向左),并用0填充"空"LSB位.

>>会向着转向LSB(向右,在我的情况),并填写"空"与MS位位

因此,x = x << 7将导致LSB移动到MSB,并将所有内容设置为0.

1000.0000
Run Code Online (Sandbox Code Playgroud)

现在,让我说我会>> 7,最后的结果.这会导致[0000.0010]?我对吗?

关于转移运营商我的假设是对的吗?

我刚在我的机器上测试过,**

int x = 1;   //000000000......01

x = x << 31; //100000000......00

x = x >> 31; //111111111......11 (Everything is filled with 1s !!!!!) 
Run Code Online (Sandbox Code Playgroud)

为什么?

c bit-manipulation

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

逐位运算一元〜(反转)

我对~操作员有点困惑.代码如下:

a = 1
~a  #-2
b = 15
~b  #-16
Run Code Online (Sandbox Code Playgroud)

怎么~办?

我想,~a会是这样的:

0001 = a
1110 = ~a 
Run Code Online (Sandbox Code Playgroud)

为什么不?

python bit-manipulation

53
推荐指数
4
解决办法
7万
查看次数

不使用abs函数或if语句获取绝对值

我在想如何在不使用if语句的情况下获取整数的绝对值abs().起初我使用左移位(<<),试图将负号移出范围,然后将位移回原位,但不幸的是它对我不起作用.请让我知道它为什么不起作用以及其他替代方法.

c bit-manipulation

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

64位整数中OR相邻位的有效方法

我想要做的是采用由位对组成的64位无符号整数,如果相应对中的两个位都为0,则从中创建一个包含0的32位整数,否则为1.换句话说,转换看起来像这样的东西:

01 00 10 11
Run Code Online (Sandbox Code Playgroud)

进入看起来像这样的东西

1 0 1 1
Run Code Online (Sandbox Code Playgroud)

两个明显的解决方案是每个字节的强力循环或查找表,然后执行8次查找并将它们组合成OR和位移的最终结果但我确信应该有一种有效的方法来进行比特纠缠.我将在C++中为64位整数执行此操作,但如果有人知道为更短的整数执行此操作的有效方法,我确信我可以弄清楚如何扩展它.

c++ bit-manipulation

53
推荐指数
6
解决办法
3521
查看次数

如何在不使用++或+或其他算术运算符的情况下添加两个数字

如何在不使用++或+或任何其他算术运算符的情况下添加两个数字?

这是一个很久以前在一些校园采访中提出的问题.无论如何,今天有人问了一些有关操作的问题,并且在答案中提到了一个美丽的斯坦福钻头.我花了一些时间研究它,并认为实际上可能有一个问题的答案.我不知道,我找不到一个.答案是否存在?

c c++ algorithm bit-manipulation

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