Clojure中的无符号16位整数

时间:2017-02-01 15:36:59

标签: java clojure jvm

我想在Clojure中使用按位函数(bit-shift-rightbit-and等),其中操作数是无符号的16位整数。

16位整数是从0到65535的十进制数,或者是从0000 0000 0000 0000到1111 1111 1111 1111的二进制数。

例如,这里123是java.lang.Long,因此会产生错误的答案:

(bit-not 123)

如何使123成为无符号16位整数,以便上面产生正确答案,即十进制65412?

所以0000 0000 0111 1011(123)应该变成1111 1111 1000 0100(65412)。

2 个答案:

答案 0 :(得分:4)

Java(和Clojure)没有无符号整数类型。 Clojure主要只提供32位有符号整数位操作(def upload_budget_pdfs(request, project_id): project = Project.objects.get(id=project_id) print("Value of project in 'upload_budget_pdfs()': ", project) if request.method == 'POST': presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn') print("Value of presentations in 'upload_budget_pdfs()': ", presentations) drawing_formset = DrawingUploadFormset(request.POST, request.FILES, prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created')) if drawing_formset: print "Before", [b.id for b in project.budget_versions.all()] try: for drawing_form in drawing_formset: #ERF(24/01/2017 @ 1610) This line is what's causing the MultiValueDictKeyError print 'drawing for loop entered in upload_budget_pdfs() - line 1034 ' if drawing_form.instance.budget: print 'if statement entered - line 1036 ' print 'Instance: ', drawing_form.instance.budget drawing = drawing_form.save(commit=False) drawing.budget = drawing_form.instance.budget drawing.save() print drawing, [b.id for b in project.budget_versions.all()] except Exception as e: print '%s (%s)' % (e.message, type(e)) else: print("Drawing formset not valid. ", drawing_formset.errors) budget_formset = BudgetPresentationFormset(request.POST, request.FILES, instance=project, prefix="presentations") if budget_formset: try: # Add a boolean so that budget is only added to form once budgetSaved = False for budget_form in budget_formset: if budget_form: if budgetSaved == False: print 'if statement entered - line 1081 ' budget = budget_form.save(commit=False) budget.save() budgetSaved = True except Exception as e: print '%s (%s)' % (e.message, type(e)) else: print("Budget formset not valid. ", budget_formset.errors) return HttpResponseRedirect(reverse('projects:concept', args=[project_id])) 除外,相当于Java中的unsigned-bit-shift-right。)

Java 8对通过Integer和Long类上的新方法将16位整数视为无符号整数的支持有限,它可以执行一些无符号运算(比较,乘法,除法,余数)。请参阅:http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

有一些外部库在Java中提供此功能,如https://github.com/jOOQ/jOOU

答案 1 :(得分:2)

这有效:

(->> 123
     bit-not
     (bit-and 16rFFFF))
;65412

您可以将其缩短为:

(->> 123
     (bit-and-not 16rFFFF))
;65412

我们正在使用long作为无符号int的代理。无论您使用哪种语言,JVM都没有未签名的intlong s。