我有一个遗留应用程序,它接受一个整数,将其转换为二进制字符串,反转该字符串,然后将位(一个)的位置作为整数列表获取。例如:
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 )。
我正在转换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)
有更标准的方法吗?
我试图理解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)
实际发生了什么?还有什么其他的魔法?我可以查阅任何参考资料并了解更多信息吗?
我很擅长处理比特,并且在编译时遇到以下警告:
Run Code Online (Sandbox Code Playgroud)7: warning: left shift count >= width of type
我的第7行看起来像这样
unsigned long int x = 1 << 32;
Run Code Online (Sandbox Code Playgroud)
如果long
我的系统的大小是32位,这将是有意义的.但是,sizeof(long)
返回8
并CHAR_BIT
定义为8
建议long应为8x8 = 64位长.
我在这里错过了什么?是sizeof
和CHAR_BIT
不准确还是我误解了一些基本的东西?
如何检查字节中的某个位是否已设置?
bool IsBitSet(Byte b,byte nPos)
{
return .....;
}
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚算术位移运算符在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)
为什么?
我对~
操作员有点困惑.代码如下:
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)
为什么不?
我在想如何在不使用if
语句的情况下获取整数的绝对值abs()
.起初我使用左移位(<<
),试图将负号移出范围,然后将位移回原位,但不幸的是它对我不起作用.请让我知道它为什么不起作用以及其他替代方法.
我想要做的是采用由位对组成的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位整数执行此操作,但如果有人知道为更短的整数执行此操作的有效方法,我确信我可以弄清楚如何扩展它.
如何在不使用++或+或任何其他算术运算符的情况下添加两个数字?
这是一个很久以前在一些校园采访中提出的问题.无论如何,今天有人问了一些有关操作的问题,并且在答案中提到了一个美丽的斯坦福钻头.我花了一些时间研究它,并认为实际上可能有一个问题的答案.我不知道,我找不到一个.答案是否存在?