I'm trying to understand how bit shift works. Can someone please explain the meaning of this line:
while ((n&1)==0) n >>= 1;
Run Code Online (Sandbox Code Playgroud)
where n is an integer and give me an example of a n when the shift is executed.
可能重复:
如何在python中获得逻辑上正确的二进制移位
如何在python中执行无符号右移?
IE等价的java是这样的:
x >>> y or x >>>= y
Run Code Online (Sandbox Code Playgroud) static void Main(string[] args)
{
string s = "ABCDEFGH";
string newS = ShiftString(s);
Console.WriteLine(newS);
}
public static string ShiftString(string t)
{
char[] c = t.ToCharArray();
char save = c[0];
for (int i = 0; i < c.Length; i++)
{
if (c[i] != c[0])
c[i] = c[i - 1];
}
Console.WriteLine(c);
String s = new string(c);
return s;
}
Run Code Online (Sandbox Code Playgroud)
我需要将字符串s向左移动一个空格,所以我最终得到了字符串:"BCDEFGHA"所以我想将字符串更改为char数组并从那里开始工作,但我不知道如何成功制作这项工作.我很确定我需要一个for循环,但我需要一些帮助来解决如何将char序列向左移动一个空格.
我不小心碰到了iPad上Safari的javascript引擎中一个非常奇怪的错误.
无符号移位运算符>>>应该按位右移数字.我在脚本中遇到了一些错误,这些错误在其他平台上运行良好,将其剥离并最终得到:
<html><head><script type='text/javascript'>
var one = 1;
function Zero()
{
return one*0;
}
function Strange()
{
return one = (Zero()+1) >>> 0;
}
var s = 'A bunch of ones: '; // except on iPad :(
for (var i=0; i<200; i++)
{
s += Strange()+' ';
}
document.write(s);
</script></head><body></body></html>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它正确地生成了一堆,但在某个时刻,某些东西会中断并且从那时起它只会输出零.
显然>>> 0在这里毫无意义(零位置的移位通常什么都不做,尽管如果javascript做出这种区分,它可能会强制整数变为无符号).这只是为了证明这个问题,如果你省略了>>> 0它没有显示出来.在我的实际情况中,有不同的数字和更复杂的表达涉及,但同样的事情发生:一切都工作,直到一些迭代,然后一些'休息'和变量突然变成并保持为零,即使在后续计算真正应该做他们非零.
适用于Android和PC浏览器.奇怪吧?
所以我知道这听起来像是重复的,但它不是(或者如果它是,我所能找到的所有可接受的答案都不能按我需要的方式工作).问题是:
我正在使用jQuery编写HTML5,我需要创建一个允许多选和控制和移位的网格.我有这个逻辑工作,但每当你按住Shift键点击它选择网格中的文字.我想阻止这种选择,但是这里和我发现的其他问题之间的关键区别是:我希望在其他所有时间选择文本.
重申:我想使用shift WITHOUT禁用所有指定元素的文本选择来禁用文本选择.有谁知道我怎么做到这一点?
- 编辑 -
以下(在网格的构造函数中)为我解决了这个问题.正如回答者所说,我宣布了一个不可选择的课程.
this.gridBody = $("#userGrid");
var handleKeydown = function(e)
{
e = e || window.event;
var keyPressed = e.keyCode || e.which;
if (keyPressed == keys.shift) {
e.data.gridBody.addClass("unselectable");
}
};
var handleKeyup = function(e)
{
e = e || window.event;
var keyPressed = e.keyCode || e.which;
if (keyPressed == keys.shift) {
e.data.gridBody.removeClass("unselectable");
}
};
$(document).on('keydown', this, handleKeydown);
$(document).on('keyup', this, handleKeyup);
Run Code Online (Sandbox Code Playgroud) 在一次采访中询问了这个问题.
<<负值左移具有未定义行为的原因是什么,而>>负数签名数的右移具有实现定义的行为?
C11 $ 6.5.7:
第4段:
E1 << E2的结果是E1 左移 E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1 x 2 ^ E2,模数比结果类型中可表示的最大值减1.如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1 x 2 ^ E2,那么这就是结果值; 否则,行为未定义.
第5段:
E1 >> E2的结果是E1 右移 E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有带符号类型和负值,则结果值是实现定义的.
为什么左移一个负的有符号值是不明确的行为?
某些语言(例如 Java、Verilog)同时具有按位逻辑运算符(<<、>>)和算术移位运算符(<<<、>>>)。
对于无符号值,逻辑移位和算术移位具有相同的操作。假设 8'b11000101 是 8 位无符号数 197 的二进制表示,那么
8'b11000101 >> 2 => 8'b00110001
8'b11000101 >>> 2 => 8'b00110001
8'b11000101 << 2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)
对于有符号值,只有算术和逻辑左移操作是相同的,但算术右移会导致符号扩展。假设 8'b11000101 是 8 位有符号数 -59 的二进制表示,那么
8'b11000101 >> 2 => 8'b00110001
8'b11000101 >>> 2 => 8'b11110001
8'b11000101 << 2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)
Python只有逻辑移位运算符,没有算术移位运算符。那么如何在Python中实现有符号和无符号值的算术右移呢?
我有一个点对象:
class Point {
final int x,y;
...
}
Run Code Online (Sandbox Code Playgroud)
因为这些点将在我的代码中的所有位置使用/创建,所以我想开始使用guavas缓存.遗憾的是,CacheLoader只接受一个参数. stackoverflow的另一个问题是使用一个对象来解决类似的问题.但我不喜欢为每个缓存请求创建一个虚拟对象.所以我想出了自己的解决方法:
因为对象是由x和y指定的,所以我认为我可以将两个值合并(移位)为long,这将是我的关键.
void test(int x, int y) {
Long key = (long) ((long) (x) << Integer.SIZE | y);
Point point = cache.get(key);
}
CacheLoader<Long, Point> loader = new CacheLoader<Long, Point>() {
public Point load(Long key) throws Exception {
final int x,y;
// shift magic
x = (int) (key >> Integer.SIZE);
y = key.intValue();
return new Point(x, y);
}
};
Run Code Online (Sandbox Code Playgroud)
我实际上是一个转移菜鸟.这会有用吗?我错过了什么?这比同类"快"吗?那是我的问题!
是的,我测试代码,到目前为止,我可以告诉它.
我试图找出在没有传递参数的情况和参数传递为0的情况下在Perl中区分的最佳方法,因为它们对我来说意味着不同的东西.
(通常我喜欢歧义,但在这种情况下我生成SQL所以我想用NULL替换未定义的args,但将0保留为0.)
所以这是含糊不清的:
sub mysub {
my $arg1 = shift;
if ($arg1){
print "arg1 could have been 0 or it could have not been passed.";
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我最好的解决方案......但我认为这有点难看.我想知道你是否可以想到一个更清洁的方式或者这对你来说是否合适:
sub mysub {
my $arg1 = (defined shift) || "NULL";
if ($arg1 ne "NULL"){
print "arg1 came in as a defined value.";
}
else {
print "arg1 came in as an undefined value (or we were passed the string 'NULL')";
}
}
Run Code Online (Sandbox Code Playgroud)